java - requestmapping - spring mvc formulario ejemplo
¿Cómo manejar las OPCIONES HTTP con Spring MVC? (5)
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:
...
<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>
...
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.
Me gustaría interceptar la solicitud OPTIONS con mi controlador utilizando Spring MVC, pero está atrapado por DispatcherServlet. ¿Cómo puedo gestionar eso?
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 primavera 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");
}
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("/*");
Tomé el siguiente enfoque:
Usando Maven ( o manualmente ) tire de esta dependencia:
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>1.3.2</version>
</dependency>
Esto tiene una implementación para capturar todas las solicitudes de OPCIONES entrantes. En el archivo web.xml, agregue la siguiente configuración:
<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>
El problema que he visto con el enfoque / ** es una implementación de controlador más específica que anulará esto.
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS)
public View getOptions() {
}
Debe configurar el dispatcherServlet configurando su dispatchOptionsRequest
en true