我正在使用 Spring Data REST 构建 RESTful API。直到现在,我的这个 RESTful 服务的 HTML GUI 是从同一个 Tomcat 提供的,我没有遇到跨源请求的问题。
现在我想从不同的服务器提供静态文件。这意味着 API 在另一个域/端口上。浏览器将发送 OPTIONS 请求以从服务器获取访问控制 header 。不幸的是,Spring Data REST 不处理这些 OPTIONS 请求,甚至返回 HTTP 500。
我尝试创建一个自定义 Controller 来处理所有 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 参数打开。
最佳答案
tl;dr:目前 Spring Data REST 根本不响应 OPTIONS
请求。
可能值得在我们的 JIRA 中开张票.
Browsers will send the OPTIONS request to get the Access-Control headers from the server.
在某处指定了吗?如果是这样,如果票证描述包含指向该规范的链接,那就太好了。
关于您的解决方法的一些评论:
-
Controller 方法上的
@RequestMapping
覆盖了method
属性,预计现在匹配所有 HTTP 方法,这就是为什么您会看到所有请求都被拦截的原因.因此,您也需要在那里将OPTIONS
定义为 HTTP 方法(或者可能不是在类映射中)。- 您没有返回任何
Allow
header ,这是OPTIONS
的全部目的。 - 我想知道这种方法在一般情况下是否有意义,因为一般情况下很难推断出受支持的 HTTP 方法。
关于Spring Data REST CORS - 如何处理预检选项请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24410598/