origins invalid allow all spring spring-mvc spring-boot http-options-method

allow - invalid cors request spring boot



¿Cómo manejar las solicitudes de OPCIONES HTTP en Spring Boot? (2)

Opción 1: propiedades de Spring Boot (solo Spring Boot 1.3.0+)

A partir de Spring Boot 1.3.0, este comportamiento se puede configurar mediante la siguiente propiedad:

spring.mvc.dispatch-options-request=true

Opción 2: Custom DispatcherServlet

DispatcherServlet en Spring Boot está definido por DispatcherServletAutoConfiguration . Puede crear su propio bean DispatcherServlet en algún lugar de sus clases de configuración, que se utilizará en lugar del que se encuentra en la configuración automática:

@Bean(name = DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) public DispatcherServlet dispatcherServlet() { DispatcherServlet dispatcherServlet = new DispatcherServlet(); dispatcherServlet.setDispatchOptionsRequest(true); return dispatcherServlet; }

Pero tenga en cuenta que la definición de su bean DispatcherServlet deshabilitará la configuración automática, por lo que debe definir manualmente otros beans declarados en la clase de configuración automática, a saber, ServletRegistrationBean para DispatcherServlet .

Opción 3: BeanPostProcessor

Puede crear la implementación BeanPostProcessor que establecerá el atributo dispatchOptionsRequest en true antes de que se inicialice el bean. Yoy puede poner esto en algún lugar de sus clases de configuración:

@Bean public DispatcherServletBeanPostProcessor dispatcherServletBeanPostProcessor() { return new DispatcherServletBeanPostProcessor(); } public static class DispatcherServletBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof DispatcherServlet) { ((DispatcherServlet) bean).setDispatchOptionsRequest(true); } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } }

Opción 4: SpringBootServletInitializer

Si tuviera SpringBootServletInitializer en su aplicación, podría hacer algo como esto para habilitar el envío de OPCIONES:

public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } @Override public void onStartup(ServletContext servletContext) throws ServletException { super.onStartup(servletContext); servletContext.getServletRegistration(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) .setInitParameter("dispatchOptionsRequest", "true"); } }

Sin embargo, eso solo funcionaría si implementara su aplicación como WAR en el contenedor de Servlet, ya que el código SpringBootServletInitializer no se ejecuta al ejecutar su aplicación Spring Boot utilizando el método main .

En primer lugar, he leído " ¿Cómo manejar las OPCIONES HTTP con Spring MVC? ", Pero las respuestas no parecen ser directamente aplicables a Spring Boot.

Parece que debería hacer esto:

configure el dispatcherServlet estableciendo su dispatchOptionsRequest en true

Pero, ¿cómo hacer eso , dado que no tengo configuraciones XML o ninguna clase de inicializador DispatcherServlet en mi código ( mencionado en esta respuesta )?

En una clase @RestController , tengo un método como este, que actualmente no se invoca.

@RequestMapping(value = "/foo", method = RequestMethod.OPTIONS) public ResponseEntity options(HttpServletResponse response) { log.info("OPTIONS /foo called"); response.setHeader("Allow", "HEAD,GET,PUT,OPTIONS"); return new ResponseEntity(HttpStatus.OK); }

Spring Boot 1.2.7.RELEASE; una configuración simple no muy diferente de la de la guía Spring REST .


Me encontraba con este problema con una aplicación de descanso basada en Spring Boot 1.3.x y mientras diagnosticaba el problema, permití que Spring Tool Suite se actualizara a la última versión.

Cuando creé una nueva prueba Spring Boot RestController en el STS actualizado, funcionó como se anuncia en la documentación de Spring 4.3. Noté que la dependencia de Maven había saltado a spring boot 1.5.8 en la nueva aplicación de prueba, así que simplemente cambié la dependencia de la aplicación anterior para actualizarla a spring boot 1.5.8 / spring 4.3.12. Eso solucionó el problema y ahora funciona como se anuncia con una anotación RequestMapping que especifica un interés en manejar las solicitudes OPTIONS ...

@RequestMapping(value="/account/{id}", method={RequestMethod.OPTIONS,RequestMethod.GET})

... ahora envía la solicitud OPTIONS al controlador.

Por lo tanto, si puede actualizar a una versión posterior de Spring, no debería tener que definir ninguna configuración especial para habilitar el manejo del método de solicitud OPTIONS (Spring 4.3.12 / Spring Boot 1.5.8).