it-swarm.com.de

Wie gehe ich mit Spring MVC mit HTTP OPTIONS um?

Ich möchte die OPTIONS-Anfrage mit Spring MVC mit meinem Controller abfangen, wird jedoch vom DispatcherServlet abgefangen. Wie kann ich das schaffen?

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

}

Sie sollten das dispatcherServlet konfigurieren, indem Sie dispatchOptionsRequest auf true setzen.

12
Bozho

Ich habe der Bozho-Antwort für Anfänger einige Details hinzugefügt .. Manchmal ist es nützlich, den Spring Controller die OPTIONS-Anfrage verwalten zu lassen (z. B. um den korrekten "Access-Control-Allow- *" - Header festzulegen, um eine AJAX call) . Wenn Sie jedoch die gängige Praxis anwenden

@Controller
public class MyController {

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

Es funktioniert nicht, da das DispatcherServlet die Anforderung OPTIONS des Clients abfängt.

Die Problemumgehung ist sehr einfach:

Sie müssen das DispatcherServlet aus Ihrer Datei web.xml wie folgt konfigurieren:

...
  <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>
...

Der Parameter "dispatchOptionsRequest" wird hinzugefügt und auf true gesetzt.

Das DispatcherServlet delegiert nun die OPTIONS-Behandlung an Ihren Controller und die manageOption () -Methode wird ausgeführt.

Hoffe das hilft.

PS. Um ehrlich zu sein, sehe ich, dass das DispatcherServlet die Liste der zulässigen Methoden an die Antwort anhängt. In meinem Fall war das nicht wichtig und ich ließ das Ding los. Möglicherweise sind weitere Untersuchungen erforderlich.

33
MaVVamaldo

Als schnelle Ergänzung zu den oben genannten 2 Antworten wird im Folgenden beschrieben, wie dispatchOptionsRequest in einer Servlet 3-Umgebung (keine web.xml) -Umgebung aktiviert wird, da ich eine Weile brauchte, um herauszufinden, wie die obigen Antworten in einem Nicht-XML-Setup angewendet werden.

In einer Spring 3.2/Servlet 3-Umgebung haben Sie eine Reihe von DispatcherServlet-Initialisierungsklassen, die dem Java-Äquivalent von web.xml entsprechen. In meinem Fall ist es die AbstractAnnotationConfigDispatcherServletInitializer. Durch Hinzufügen des folgenden Codes wird dispatchOptionsRequest aktiviert:

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

Ich habe folgenden Ansatz gewählt:

Verwenden Sie Maven ( oder manuell ), und ziehen Sie diese Abhängigkeit ein:

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

Dies hat eine Implementierung, um alle eingehenden OPTIONS-Anforderungen zu erfassen. Fügen Sie in der Datei web.xml die folgende Konfiguration hinzu:

<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>

Das Problem, das ich mit dem Ansatz/** gesehen habe, ist, dass eine spezifischere Controller-Implementierung dies überschreibt. 

3
Jim

Für Spring ohne Datei web.xml und basierend auf der Antwort von Paul Adamson setze ich den Parameter dispatchOptionsRequest auf true im Dispatcher, um die Aufrufe der Options-Methode zu verarbeiten.

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

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

dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
0
Daniel De León