Soru Bahar MVC ile HTTP SEÇENEKLERİ nasıl ele alınır?


Kontrol cihazımla birlikte Spring MVC kullanarak OPTIONS isteğini engellemek istiyorum, ancak DispatcherServlet tarafından yakalandı. Bunu nasıl yönetebilirim?


25
2018-03-01 18:20


Menşei


Spring Boot'da olanlar için, bu takip sorusu yararlı olabilir: stackoverflow.com/questions/33331042/... - Jonik


Cevaplar:


@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS)
public View getOptions() {

}

DispatcherServlet'i ayarlayarak yapılandırmalısınız. dispatchOptionsRequest için true


11
2018-03-01 18:21



Aslında DispatcherServlet isteği engelleyeceği için işe yaramaz ve işleyecektir. Bunun yerine DispatcherServlet yapılandırılmalıdır. Bu konuda çok fazla acı çektim ve şu anda problemi kısmen çözdüm. Topluluğum için çözümümüzü göndermek istedim, ama ... ... 100'den az itibara sahip olduğumdan beri ... ... kendi sorularımı cevaplamama izin vermekiçin 8 saat beklemem için. - MaVVamaldo
Bir güncelleme ekledim - Bozho
evet çözümdür. Seninle daha önce tanışmalıydım, tanrım! XD Ancak bu, "kısmi" bir çözümdür, çünkü DispatcherServlet denetleyicinizi devretmeden önce "bazı işler" yapar. Infact, "İzin Ver" başlığına dokunmasanız bile, "izin verilen yöntem" listesiyle doldurulacaktır. Benim durumumda sorun olmaz ama sanırım başka biri için. - MaVVamaldo
Önemli güncelleme: OPTIONS istekleri varsayılan olarak Spring Framework 4.3'ten itibaren desteklenecektir, bkz. jira.spring.io/browse/SPR-13130 daha fazla ayrıntı için. - Sébastien Deleuze


Yeni başlayanlar için Bozho cevabına biraz daha ayrıntı ekledim. Bazen, yaylı denetleyicinin OPTIONS isteğini yönetmesine izin vermek yararlıdır (örneğin bir AJAX çağrısı yapmak için doğru "Access-Control-Allow-*" başlığını ayarlamak için). Ancak, ortak uygulamayı denerseniz

@Controller
public class MyController {

    @RequestMapping(method = RequestMethod.OPTIONS, value="/**")
    public void manageOptions(HttpServletResponse response)
    {
        //do things
    }
}

DispatcherServlet, istemcinin OPTIONS isteğini engelleyeceği için çalışmaz.

Çözüm çok basit:

DispatcherServlet'i web.xml dosyanızdan aşağıdaki gibi yapılandırmanız gerekir:

...
  <servlet>
    <servlet-name>yourServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>dispatchOptionsRequest</param-name>
      <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
...

"DispatchOptionsRequest" parametresini eklemek ve bunu true olarak ayarlamak.

Şimdi DispatcherServlet, OPTIONS işlemcisini denetleyicinize devredecek ve manageOption () yöntemi çalışacaktır.

Bu yardımcı olur umarım.

PS. dürüst olmak gerekirse, DispatcherServlet'in yanıt için izin verilen yöntemin listesini eklediğini görüyorum. Benim durumumda bu önemli değildi ve işin gitmesine izin verdim. Belki daha ileri incelemeler gereklidir.


31
2018-03-02 08:45



Ancak bu, örneğin "/ x / y" bitiş noktasında bir handlermethod kaydedilmişse işe yaramaz. Şimdi / x için bir OPTIONS-isteği çalışır, ancak / x / y için bu sorunu çözmek için herhangi bir seçenek var mı? Bu OPTIONS kullanımının kayıtlı tüm uç noktalara ekleneceği anlamına mı geliyor? Engelleyicileri düşünüyorum ama başka bir yolu var mı? - wrm


Yukarıdaki 2 yanıtın hızlı bir tamamlayıcısı olarak, burada xml olmayan bir kurulumda yukarıdaki yanıtları nasıl uygulayacağımı öğrenmek için bana bir süre harcadığı için, bir servlet 3 (web.xml) ortamında dispatchOptionsRequest'i etkinleştirebilirsiniz.

Bir bahar 3.2 / servlet 3 ortamında, çeşitli çeşitleriniz olacak DispatcherServlet web.xml'nin java karşılığı olan başlatıcı sınıfı; benim durumumda AbstractAnnotationConfigDispatcherServletInitializer. Aşağıdaki kodu eklemek dispatchOptionsRequest'i etkinleştirir:

    @Override
    protected void customizeRegistration(Dynamic registration) {
        registration.setInitParameter("dispatchOptionsRequest", "true");
    }

8
2018-04-02 10:23





Aşağıdaki yaklaşımı aldım:

Maven Kullanımıveya elle) Bu bağımlılığı çekin:

<dependency>
    <groupId>com.thetransactioncompany</groupId>
    <artifactId>cors-filter</artifactId>
    <version>1.3.2</version>
</dependency>

Bu, tüm gelen OPTIONS isteklerini yakalamak için bir uygulama vardır. Web.xml dosyasına aşağıdaki yapılandırmayı ekleyin:

<filter>
   <filter-name>CORS</filter-name>
   <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>       
   <init-param>
      <param-name>cors.supportedHeaders</param-name>
      <param-value>Content-Type,Accept,Origin</param-value>
   </init-param>
</filter>

<filter-mapping>
   <filter-name>CORS</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

/ ** yaklaşımında gördüğüm problem, daha spesifik bir Denetleyici uygulamasının bunu geçersiz kılacağıdır.


3
2018-04-15 18:17





Web.xml dosyası olmadan Spring için ve Paul Adamson cevabını temel alarak, sadece parametreyi ayarladım dispatchOptionsRequest için true dağıtmak için dağıtıcıya Options yöntem çağrıları.

ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new        DispatcherServlet(applicationContext));

dispatcher.setInitParameter("dispatchOptionsRequest", "true");                

dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");

0
2018-01-03 21:15