5

我们正在实现一个基于 AngularJS 的应用程序,它使用托管在不同域中的 rest web 服务。以下脚本用于 CORS,它在 Chrome 和 FireFox 上完美运行。身份验证时在 IE9 和 Safari 中存在问题。似乎问题出在这些浏览器中的withCredentials属性上。IE 和 Safari 是否有其他方式支持 CORS?

<script type="text/javascript">
     XMLHttpRequest.prototype.realSend = XMLHttpRequest.prototype.send;
     XMLHttpRequest.prototype.send = function(vData) {
        this.withCredentials = true;
        this.realSend.apply(this, arguments);
     };
</script>
4

1 回答 1

7

根据我们尝试的不同场景,我们可以得出以下总结。希望这会很有用。

  1. 根据浏览器规范 IE10+ 和 Safari 4+ 版本支持 XHR 和 withCredentials 属性。
  2. 这可以用于 CORS 而不会出现上述脚本中的任何问题。
  3. 对于其他 IE 版本 (9-),我们需要使用 XDR。
  4. 当涉及到 HTTPS 时,URL 重写模块在服务器端并不成功。

解决方案非常简单。默认情况下,IE 和 Safari 已禁用 3rd 方 cookie。由于一旦用户输入凭据进行登录,我们就会使用两个不同的域,因此这些浏览器无法保存该 cookie。因此,所有其他请求都是未经授权的。

允许 3rd 方 cookie 的步骤

  • IE 10 - Internet 选项 > 隐私 > 高级 > 第三方 Cookies > 接受
  • Safari - 首选项 > 隐私 > 阻止 Cookie > 从不

由于这个问题,我们发现在 AngularJS 版本 1.1.1+ 中,他们通过在 'config' 模块中设置 'withCredentials' 值($httpProvider.defaults.withCredentials = true;)使其变得容易

于 2013-10-08T12:28:05.400 回答