我使用Spring Data REST构建RESTful API。到目前为止,我的这个RESTful服务的HTML GUI是从同一个Tomcat提供的,我对Cross Origin请求没有任何问题。
现在我想从不同的服务器提供静态文件。这意味着API位于另一个域/端口上。浏览器将发送OPTIONS请求以从服务器获取Access-Control标头。不幸的是,Spring Data REST不处理那些OPTIONS请求甚至返回HTTP 500。
我尝试创建一个处理所有OPTIONS请求的自定义控制器
@Controller
@RequestMapping(value = "/**", method = RequestMethod.OPTIONS)
public class OptionsController {
@RequestMapping
public ResponseEntity options() {
return new ResponseEntity<Void>(HttpStatus.OK);
}
}
适用于OPTIONS,但随后所有其他请求(如GET)都无法使用。
OPTIONS请求通过dispatchOptionsRequest调度程序servlet参数打开。
答案 0 :(得分:0)
tl; dr:目前Spring Data REST根本没有回复OPTIONS
个请求。
可能值得在JIRA开票。
浏览器将发送OPTIONS请求以从服务器获取Access-Control标头。
这是指定的吗?如果是这样,如果故障单描述包含指向该规范的链接,那将会很酷。
关于您的解决方法的一些评论:
@RequestMapping
会覆盖method
属性,并且现在可以匹配所有 HTTP方法,这就是您查看所有请求被截获的原因。所以你需要在那里定义OPTIONS
作为HTTP方法(或者可能不是在类映射中)。Allow
标题,这是OPTIONS
的全部目的。答案 1 :(得分:0)
只需将参数dispatchOptionsRequest
设置为true
到调度程序中即可处理Options
方法调用,进入WebApplicationInitializer
的实现。
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(applicationContext));
dispatcher.setInitParameter("dispatchOptionsRequest", "true");
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");