【发布时间】:2016-11-01 09:39:02
【问题描述】:
我有一个 grails 2.2.4 应用程序。我想启用 CORS 所以我通过在构建配置中添加以下行来安装 cors 插件。
plugins {
runtime ':cors:1.1.8'
}
然后在config.groovy中
cors.headers = ['Access-Control-Allow-Origin': '*']
但在此之后,当我运行应用程序时,CORS in 未启用。所以我调试了CORS插件。问题似乎在以下方法中的 CorsFilter 类中
private boolean checkOrigin(HttpServletRequest req, HttpServletResponse resp) {
String origin = req.getHeader("Origin");
if (origin == null) {
//no origin; per W3C spec, terminate further processing for both preflight and actual requests
return false;
}
上一行中的 origin 参数始终为 null,因为请求没有参数 'Origin'。有什么我做错了吗?我不是在寻找添加一个名为“Origin”的手动标题的答案,因为这不是一个正确的修复
我对 CORS 还很陌生,因此请多多指教。
【问题讨论】:
-
您的设置有问题。如果要相信developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin(并且可能应该),那么每个 CORS 请求都应该包含“Origin”HTTP 标头。在您的测试场景中生成请求的原因是什么?
-
为了测试,我使用 RestClient 发送请求,在标头中设置内容类型并将 GET 请求发送到我的本地主机和开发服务器。如果我向服务器发送请求,则使用相同的 RestClient 手动将 Apache cors.conf 中的 CORS 设置更改为
Access-Control-Allow-Origin': *我在启用所有来源的响应中返回标头。 (因为我有负载平衡,新的启动服务器获得默认值,无论如何我想通过插件处理这个) -
在这种情况下,RestClient 看起来不像是浏览器:我在它的代码中找不到任何暗示它自己向任何请求添加“Origin”标头的内容。正如您在上面的 mozilla 链接中看到的那样,真正的浏览器可以做到这一点。所以看起来你需要的答案是你明确表示你不想要的答案......至少,你应该只需要通过在 RestClient 实例上调用
setHeaders([Origin: 'http://idontthinkitmatters/'])来做一次。