为什么重定向的CORS请求失败?

时间:2014-08-26 06:09:50

标签: angularjs cors

我的问题是在我的应用运行localhost:8080

上的angularjs $ http调用
var url "https://api.acme.com/RX/v1/user";
$http.get(url).success(function (data) {
    alert('yay');
$scope.user = data;
});

第一个请求成功,Chrome记录了以下响应:

Status Code:302 Found
Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://localhost:8080
Location:https://login.acme.com/cas/login?service=https%3A%2F%2Fapi.acme.com%2FRX%2Fv1%2Fuser

这导致浏览器向重定向位置发出第二个GET请求:

https://login.acme.com/cas/login?service=https%3A%2F%2Fapi.acme.com%2FRX%2Fv1%2Fuser

第二个请求失败,Chrome中报告了以下错误:

XMLHttpRequest cannot load https://login.acme.com/cas/login?service=https%3A%2F%2Fapi.acme.com%2FRX%2Fv1%2Fuser. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

所以我有一个从源到URL的CORS请求,允许将请求重定向到另一个也配置为允许请求的URL。但是重定向请求失败了。我应该期待这个吗?

注意,api.acme.com和login.acme.com都配置为允许使用

的所有来源
Access-Control-Allow-Origin: *

3 个答案:

答案 0 :(得分:2)

问题是由于当302从XHR请求返回时浏览器将Origin设置为null。顺便说一句,这对我来说似乎很奇怪,因为使用原始Origin制作302更有意义,而不是null。

当Origin null到达我们的服务器时,那里的apache tomcat CORS实现(http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter,tomcat 7.0.52)不返回Access-Control-Allow-Origin头,即使服务器配置为允许所有来源。 注意:此行为现已在当前版本的Tomcat 7中修复。

解决方案是在服务器上使用不同的CORS实现(http://software.dzhuvinov.com/cors-filter.html)。此过滤器返回Access-Control-Allow-Origin:null并且302 XHR成功。

虽然我找到了一个解决方案,但我仍然不确定两件事:

  1. 当XHR导致重定向时,浏览器将Origin发送为null
  2. tomcat过滤器或dzhuvinov软件过滤器是否正确响应Origin null。

答案 1 :(得分:2)

参见本节(7.1.7)的第6步:http://www.w3.org/TR/cors/#redirect-steps

可在此处找到更多讨论:https://code.google.com/p/chromium/issues/detail?id=154967

  

不幸的是,传输字符串“null”的惯例使它看起来像是一个bug;我自己这么想,直到我追踪到这一点:)

答案 2 :(得分:0)

如果您使用LoginRequiredMiddleware,请务必在settings.py中将URL添加到LOGIN_EXEMPT_URLS。