如何在Spring Boot中处理HTTP OPTIONS请求?

首先,我已经阅读“How to handle HTTP OPTIONS with Spring MVC?”,但答案似乎并不直接适用于Spring Boot。

看起来我应该这样做:

configure the dispatcherServlet by setting its
dispatchOptionsRequest to true

但是在我的代码(mentioned by this answer)中,由于我没有XML配置,或者是各种DispatcherServlet的初始化器类呢?

在@RestController类中,我有一个这样的方法,目前不被调用。

@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;一个简单的设置与Spring REST guide没有很大的不同。

最佳答案
选项1:弹簧启动属性(仅限Spring Boot 1.3.0)

从Spring Boot 1.3.0开始,可以使用以下属性配置此行为:

spring.mvc.dispatch-options-request=true

选项2:自定义DispatcherServlet

Spring Boot中的DispatcherServlet由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,即DispatcherServlet的ServletRegistrationBean。

选项3:BeanPostProcessor

您可以创建BeanPostProcessor实现,它将在初始化bean之前将dispatchOptionsRequest属性设置为true。 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 dispatch:

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代码。

转载注明原文:如何在Spring Boot中处理HTTP OPTIONS请求? - 代码日志