Spring Data REST CORS - 如何处理预检选项请求?
Posted
技术标签:
【中文标题】Spring Data REST CORS - 如何处理预检选项请求?【英文标题】:Spring Data REST CORS - how to handle preflight OPTIONS request? 【发布时间】:2014-08-16 03:07:38 【问题描述】:我正在使用 Spring Data REST 构建一个 RESTful API。到目前为止,我的这个 RESTful 服务的 html GUI 是由同一个 Tomcat 提供的,而且我在跨域请求方面没有任何问题。
现在我想从不同的服务器提供静态文件。这意味着 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 参数打开。
【问题讨论】:
你试过Tomcat的CORS过滤器吗? 没有。该问题在下一版本的 SDR 中得到修复。我们只是使用反向代理将请求映射到相同的域和端口。 【参考方案1】:tl;dr:目前 Spring Data REST 根本不响应 OPTIONS
请求。
也许值得在我们的JIRA 开一张票。
浏览器将发送 OPTIONS 请求以从服务器获取访问控制标头。
这是在某处指定的吗?如果是这样,如果票证描述包含指向该规范的链接,那就太酷了。
一些关于您的解决方法的方法:
-
控制器方法上的
@RequestMapping
覆盖了method
属性,并且预计现在匹配所有 HTTP 方法,这就是您看到所有请求被拦截的原因。因此,您也需要在此处将 OPTIONS
定义为 HTTP 方法(或者可能不是在类映射中)。
您没有返回任何 Allow
标头,这首先是 OPTIONS
的全部目的。
我想知道这种方法总体上是否有意义,因为通常很难推断支持的 HTTP 方法。
【讨论】:
感谢您的回答!我试过 1),应该已经发布了。不工作。一旦我注册了我的控制器,就没有 Data REST 导出的方法起作用。标题被添加到过滤器中。第 3 点,我认为 CORS 是一个常见问题,应该得到支持,尤其是对于 REST API。 我打开了jira.spring.io/browse/DATAREST-333。包括对 w3c 和 Mozilla 的引用。 @OliverGierke 我注意到 Spring Data REST 使用设置为“允许”的 org.springframework.http.HttpHeaders.ALLOW 设置允许方法标头。根据这个W3C Recommendation,标题名称应该是Access-Control-Allow-Methods。为什么会出现这种差异? 我们目前只是实现了规范中定义的 HTTP OPTIONS 方法。【参考方案2】:只需将参数dispatchOptionsRequest
设置为true
进入dispatcher处理Options
方法调用,进入WebApplicationInitializer
的实现。
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(applicationContext));
dispatcher.setInitParameter("dispatchOptionsRequest", "true");
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
【讨论】:
以上是关于Spring Data REST CORS - 如何处理预检选项请求?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot + Spring Data Rest Repositories 中使用 @CrossOrigin 注释的 CORS 问题
无法在 Spring Boot Data Rest 中启用 CORS
Spring boot:无法从另一个 Origin 访问安全资源 - CORS - Spring Security - Spring data rest