web-dev-qa-db-fra.com

Comment gérer les options HTTP avec Spring MVC?

J'aimerais intercepter la demande OPTIONS avec mon contrôleur à l'aide de Spring MVC, mais elle est capturée par le DispatcherServlet. Comment puis-je gérer ça?

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

}

Vous devez configurer le dispatcherServlet en définissant sa dispatchOptionsRequest sur true

12
Bozho

J'ai ajouté quelques détails supplémentaires à la réponse Bozho pour les débutants. Il est parfois utile de laisser Spring Controller gérer la requête OPTIONS (par exemple, pour définir le bon en-tête "Access-Control-Allow-*" AJAX appel). Cependant, si vous essayez la pratique courante

@Controller
public class MyController {

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

Cela ne fonctionnera pas car DispatcherServlet interceptera la requête OPTIONS du client.

La solution de contournement est très simple:

Vous devez ... configurer le DispatcherServlet à partir de votre fichier web.xml comme suit:

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

Ajout du paramètre "dispatchOptionsRequest" et définition de ce paramètre à true.

Désormais, DispatcherServlet déléguera la gestion des OPTIONS à votre contrôleur et la méthode manageOption () sera exécutée.

J'espère que cela t'aides.

PS pour être honnête, je vois que le DispatcherServlet ajoute la liste des méthodes autorisées à la réponse. Dans mon cas, ce n'était pas important et j'ai laissé la chose aller. Peut-être que d'autres examens sont nécessaires.

33
MaVVamaldo

Pour compléter rapidement les 2 réponses ci-dessus, voici comment activer dispatchOptionsRequest dans un environnement servlet 3 (no web.xml), car il m'a fallu un certain temps pour appliquer les réponses ci-dessus dans une configuration non xml.

Dans un environnement spring 3.2/servlet 3, vous aurez une variété de classes d'initialisation DispatcherServlet qui sont l'équivalent Java de web.xml; dans mon cas, c'est la AbstractAnnotationConfigDispatcherServletInitializer. L'ajout du code suivant activera dispatchOptionsRequest:

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

J'ai adopté l'approche suivante:

En utilisant Maven ( ou manuellement ), ouvrez cette dépendance:

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

Cela a une implémentation pour capturer toutes les demandes OPTIONS entrantes. Dans le fichier web.xml, ajoutez la configuration suivante:

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

Le problème que j'ai vu avec l'approche/** est une implémentation plus spécifique du contrôleur qui l'emportera. 

3
Jim

Pour Spring sans fichier web.xml et basé sur la réponse de Paul Adamson, je viens de définir le paramètre dispatchOptionsRequest sur true dans le répartiteur afin de traiter les appels de méthode Options.

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

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

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