Me gustaría interceptar la solicitud OPTIONS con mi controlador utilizando Spring MVC, pero está atrapado por DispatcherServlet. ¿Cómo puedo gestionar eso?¿Cómo se manejan las OPCIONES HTTP con Spring MVC?
Respuesta
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS)
public View getOptions() {
}
Debe configurar el DispatcherServlet estableciendo su dispatchOptionsRequest
a true
en realidad no funcionará, ya que el DispatcherServlet interceptará la solicitud y la manejará. Debería configurarse el DispatcherServlet en su lugar. Tuve mucho dolor con este problema, y actualmente resolví parcialmente el problema. Quería publicar mi solución para la comunidad pero ... dado que tengo menos de 100 de reputación, stackoverflow me obliga a esperar 8 horas antes de dejarme responder mis propias preguntas. – MaVVamaldo
He añadido una actualización – Bozho
sí, es la solución. Debería haberte conocido antes, ¡Dios mío! XD Sin embargo, esta es una solución "parcial" porque el DispatcherServlet hará "algún trabajo" antes de delegar su controlador. De hecho, aunque no toque el encabezado "Permitir", se completará con una lista de "método permitido". En mi caso, no sería un problema, pero supongo que es para otra persona. – MaVVamaldo
añadí un poco más de detalle para la respuesta Bozho para los principiantes. A veces es útil dejar que Spring Controller administre la solicitud OPTIONS (por ejemplo, para configurar el encabezado correcto "Access-Control-Allow- *" para atender una llamada AJAX). Sin embargo, si se intenta la práctica común
@Controller
public class MyController {
@RequestMapping(method = RequestMethod.OPTIONS, value="/**")
public void manageOptions(HttpServletResponse response)
{
//do things
}
}
No va a funcionar ya que el DispatcherServlet interceptará solicitud de OPCIONES del cliente.
La solución es muy sencilla:
Tienes que ... configurar el DispatcherServlet de 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>
...
Añadiendo el parámetro "dispatchOptionsRequest" y se establece en verdadero .
Ahora el DispatcherServlet delegará el manejo de OPCIONES a su controlador y se ejecutará el método manageOption().
Espero que esto ayude.
PS. 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.
pero esto no funciona, si, por ejemplo, se registra un handlermethod en el punto final "/ x/y". Ahora, ¿hay alguna opción para resolver este problema? OPCIONES-solicitud a/x pero no a/x/y ¿Quiere decir agregar este manejo de OPCIONES a todos los puntos finales registrados? Pienso en los interceptores, pero ¿hay alguna otra manera? – wrm
Como un complemento rápido a las 2 respuestas anteriores, a continuación se indica cómo habilitar dispatchOptionsRequest en un entorno servlet 3 (no web.xml), ya que tardé un rato en descifrar cómo aplicar las respuestas anteriores en un archivo no xml preparar.
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
. Añadiendo el siguiente código permitirá dispatchOptionsRequest:
@Override
protected void customizeRegistration(Dynamic registration) {
registration.setInitParameter("dispatchOptionsRequest", "true");
}
Tomé el siguiente enfoque:
El uso de Maven (or manually) tire de esta dependencia:
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>1.3.2</version>
</dependency>
Esto tiene una aplicación para capturar toda la solicitudes de OPCIONES entrantes. En el archivo web.xml añadir 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 del controlador más específica anulará esto.
para la primavera sin el archivo web.xml, y en base a la respuesta de Paul Adamson, acabo de poner el parámetro dispatchOptionsRequest
a true
en el despachador, para procesar las llamadas a métodos Options
.
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(applicationContext));
dispatcher.setInitParameter("dispatchOptionsRequest", "true");
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
- 1. ¿Cómo se manejan las solicitudes de Ajax en Spring MVC?
- 2. ¿Cómo se manejan las opciones que no se pueden usar juntas (usando OptionParser)?
- 3. AJAX con Spring MVC
- 4. ¿Cómo se manejan las cadenas en C++?
- 5. ¿Cómo se manejan las interrupciones en SMP?
- 6. ¿Cómo se manejan las funciones cpp?
- 7. ¿Cómo se manejan las dependencias 'profundas' con IoC y DI?
- 8. ¿Cómo se manejan las tareas de implementación únicas con capistrano?
- 9. ¿Cómo se manejan las declaraciones 'require (..., fianza)' con ARC?
- 10. ¿Cómo se manejan los subproyectos con autotools?
- 11. Cómo iniciar sesión Http Request body en Spring MVC?
- 12. ¿Cómo manejan oozie las dependencias?
- 13. No se encontró una asignación para la solicitud HTTP con URI: en una aplicación Spring MVC
- 14. @JsonView con Spring MVC
- 15. Spring 3 JSON con MVC
- 16. No se muestran imágenes en Spring MVC
- 17. ¿Cómo uso Comet con Spring MVC?
- 18. ¿Cómo se manejan las plantillas para los sitios web de MVC?
- 19. Controlador Spring MVC Parámetros de consulta HTTP GET
- 20. ¿Cómo se manejan las zonas horarias en CFML?
- 21. ¿Cómo se manejan las versiones en una aplicación web?
- 22. ¿Cómo se manejan las pruebas unitarias en F #?
- 23. ¿Cómo se manejan las excepciones "imposibles" en Java?
- 24. ¿Cómo se manejan las localizaciones dinámicas de sitios?
- 25. Respuesta HTTP de caché en Spring MVC Servicio de reposo
- 26. ¿Cómo se manejan las asociaciones entre los agregados en DDD?
- 27. ¿Cómo se manejan las principales actualizaciones de marco/dependencia?
- 28. ¿Cómo se manejan las señales asíncronas en Linux?
- 29. ¿Cómo se manejan las interrupciones en las máquinas con dos procesadores?
- 30. ¿Spring MVC admite las anotaciones JSR 311?
Para aquellos en la primavera de arranque, esta pregunta de seguimiento puede ser útil: http://stackoverflow.com/questions/33331042/how-to-handle-http-options-requests-in-spring-boot – Jonik