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
entrue
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).