¿Cómo manejar las OPCIONES HTTP con Spring MVC?

Me gustaría interceptar la solicitud OPTIONS con mi controlador utilizando Spring MVC, pero está atrapado por DispatcherServlet. ¿Cómo puedo gestionar eso?

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

Debe configurar el dispatcherServlet configurando su dispatchOptionsRequest en true

Agregué más detalles a la respuesta de Bozho para principiantes. En ocasiones, es útil dejar que Spring Controller administre la solicitud OPTIONS (por ejemplo, establecer el encabezado correcto “Access-Control-Allow- *” para atender una llamada AJAX). Sin embargo, si pruebas la práctica común

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

No funcionará dado que DispatcherServlet interceptará la solicitud OPTIONS del cliente.

La solución es muy simple:

Debe … configurar el DispatcherServlet desde su archivo web.xml de la siguiente manera:

 ...  yourServlet org.springframework.web.servlet.DispatcherServlet  dispatchOptionsRequest true  1  ... 

Agregar el parámetro “dispatchOptionsRequest” y establecerlo en verdadero.

Ahora el DispatcherServlet delegará el manejo de OPCIONES a su controlador y se ejecutará el método manageOption ().

Espero que esto ayude.

PD. para ser sincero, veo que DispatcherServlet anexa la lista de métodos permitidos a la respuesta. En mi caso, esto no era importante y dejé que se fuera. Tal vez se necesiten más exámenes.

Como complemento rápido a las 2 respuestas anteriores, a continuación se indica cómo habilitar dispatchOptionsRequest en un entorno de servlet 3 (no web.xml), ya que me tomó un tiempo averiguar cómo aplicar las respuestas anteriores en una configuración que no sea xml.

En un entorno de spring 3.2 / servlet 3, tendrá una variedad de clase de inicializador DispatcherServlet que es el equivalente java de web.xml; en mi caso es el AbstractAnnotationConfigDispatcherServletInitializer . Agregar el siguiente código habilitará dispatchOptionsRequest:

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

Tomé el siguiente enfoque:

Usando Maven ( o manualmente ) tire de esta dependencia:

  com.thetransactioncompany cors-filter 1.3.2  

Esto tiene una implementación para capturar todas las solicitudes de OPCIONES entrantes. En el archivo web.xml, agregue la siguiente configuración:

  CORS com.thetransactioncompany.cors.CORSFilter  cors.supportedHeaders Content-Type,Accept,Origin    CORS /*  

El problema que he visto con el enfoque / ** es una implementación de controlador más específica que anulará esto.

Para Spring sin archivo web.xml y basado en la respuesta de Paul Adamson, simplemente configuré el parámetro dispatchOptionsRequest en true en el despachador, para procesar las llamadas al método de Options .

 ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(applicationContext)); dispatcher.setInitParameter("dispatchOptionsRequest", "true"); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/*");