Ответ 1
Вариант 1: Spring Свойства загрузки (Spring Только загрузочная версия 1.3.0+)
Начиная с Spring Boot 1.3.0, это поведение можно настроить следующим образом:
spring.mvc.dispatch-options-request=true
Вариант 2: Пользовательский DispatcherServlet
DispatcherServlet
в Spring Загрузка определяется 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 отключит автоматическую настройку, поэтому вы должны вручную определить другой beans, объявленный в классе автоконфигурации, а именно ServletRegistrationBean
для DispatcherServlet
.
Вариант 3: BeanPostProcessor
Вы можете создать реализацию BeanPostProcessor
, которая установит атрибут dispatchOptionsRequest
в true
до инициализации bean. Yoy может помещать это где-то в ваши классы конфигурации:
@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, так как код SpringBootServletInitializer
не выполняется при запуске вашего приложения Spring Boot с помощью метода main
.