选项1:Spring Boot属性(仅适用于Spring Boot 1.3.0及以上版本)
从Spring Boot 1.3.0版本开始,可以使用以下属性来配置此行为:
spring.mvc.dispatch-options-request=true
选项二:自定义 DispatcherServlet
在Spring Boot中,DispatcherServlet
由DispatcherServletAutoConfiguration
定义。您可以在配置类的某个位置创建自己的DispatcherServlet
bean,它将替代自动配置中的bean:
@Bean(name = DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
public DispatcherServlet dispatcherServlet() {
DispatcherServlet dispatcherServlet = new DispatcherServlet();
dispatcherServlet.setDispatchOptionsRequest(true);
return dispatcherServlet;
}
请注意,定义自己的DispatcherServlet
bean将禁用自动配置,因此您应该手动定义在自动配置类中声明的其他bean,即DispatcherServlet
的ServletRegistrationBean
。
选项3:BeanPostProcessor
您可以创建一个BeanPostProcessor
实现,它将在初始化bean之前将dispatchOptionsRequest
属性设置为true
。 您可以将其放置在配置类中的任何位置:
@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;
}
}
选项4:SpringBootServletInitializer
如果您的应用程序中有SpringBootServletInitializer
,您可以执行以下操作以启用OPTIONS调度:
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");
}
}
如果您将应用程序部署为WAR文件并放入Servlet容器中,那么这种方法才能起作用,因为当使用main
方法运行Spring Boot应用程序时,SpringBootServletInitializer
代码不会被执行。