首先,我读过“How to handle HTTP OPTIONS with Spring MVC?”,但答案似乎并不直接适用于Spring Boot .
看起来我应该这样做:
通过将dispatchOptionsRequest设置为true来配置dispatcherServlet
But how to do that ,假设我的代码(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中的设置没有太大区别 .
2 回答
我使用基于Spring Boot 1.3.x的rest应用程序遇到了这个问题,在诊断问题时我允许Spring Tool Suite更新到最新版本 .
当我在更新的STS中创建一个新的测试Spring Boot RestController时,它在Spring 4.3下作为文档广告工作 . 我注意到Maven依赖在新的测试应用程序中跳到了 Spring 季启动1.5.8,所以我只是改变了旧应用程序的依赖关系,将其更新为spring boot 1.5.8 / spring 4.3.12 . 这解决了问题,现在它的工作方式与RequestMapping注释一样,指定了对处理OPTIONS请求的兴趣......
...现在将OPTIONS请求发送给处理程序 .
因此,如果您能够更新到更高版本的Spring,则无需为启用OPTIONS请求方法处理(Spring 4.3.12 / Spring Boot 1.5.8)定义任何特殊配置 .
选项1:Spring Boot属性(仅限Spring Boot 1.3.0)
从Spring Boot 1.3.0开始,可以使用以下属性配置此行为:
选项2:自定义DispatcherServlet
Spring Boot中的
DispatcherServlet
由DispatcherServletAutoConfiguration
定义 . 您可以在配置类中的某个位置创建自己的DispatcherServlet
bean,而不是自动配置中的bean:但请注意,定义
DispatcherServlet
bean将禁用自动配置,因此您应手动定义autoconfiguration类中声明的其他bean,即ServletRegistrationBean
forDispatcherServlet
.选项3:BeanPostProcessor
您可以创建
BeanPostProcessor
实现,在初始化bean之前将dispatchOptionsRequest
属性设置为true
. Yoy可以把它放在你的配置类中:选项4:SpringBootServletInitializer
如果您的应用程序中有
SpringBootServletInitializer
,则可以执行以下操作以启用OPTIONS调度:但是,只有在将应用程序作为WAR部署到Servlet容器中时才会起作用,因为在使用
main
方法运行Spring Boot应用程序时不会执行SpringBootServletInitializer
代码 .