Вариант 1. Свойства Spring Boot (только Spring Boot 1.3.0+)
Начиная с Spring Boot 1.3.0 это поведение можно настроить с помощью следующего свойства:
spring.mvc.dispatch-options-request=true
Вариант 2: Пользовательский DispatcherServlet
DispatcherServlet
в Spring Boot определяется DispatcherServletAutoConfiguration
. Вы можете создать свой собственный DispatcherServlet
bean-компонент где-нибудь в ваших классах конфигурации, который будет использоваться вместо того, который используется в автоконфигурации:
@Bean(name = DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
public DispatcherServlet dispatcherServlet() {
DispatcherServlet dispatcherServlet = new DispatcherServlet();
dispatcherServlet.setDispatchOptionsRequest(true);
return dispatcherServlet;
}
Но имейте в виду, что определение вашего DispatcherServlet
bean-компонента отключит автоконфигурацию, поэтому вам следует вручную определить другие bean-компоненты, объявленные в классе автоконфигурации, а именно ServletRegistrationBean
для DispatcherServlet
.
Вариант 3: BeanPostProcessor
Вы можете создать BeanPostProcessor
реализацию, которая установит для атрибута 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 в контейнере сервлетов, поскольку код SpringBootServletInitializer
не выполняется при запуске приложения Spring Boot с использованием метода main
.
person
Bohuslav Burghardt
schedule
25.10.2015