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?
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS)
public View getOptions() {
}
Vous devez configurer le dispatcherServlet en définissant sa dispatchOptionsRequest
sur true
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.
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");
}
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.
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("/*");