跨源资源共享中的this.withCredentials属性中的问题

Sha*_*aka 5 javascript cors angularjs

我们正在实现一个基于AngularJS的应用程序,该应用程序使用托管在不同域中的休息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>
Run Code Online (Sandbox Code Playgroud)

Sha*_*aka 7

根据我们尝试的不同场景,我们可以得出以下摘要.希望这会有用.

  1. 根据浏览器规范IE10 +和Safari 4+版本支持XHR和withCredentials属性.
  2. 这可以用于CORS,没有任何问题,如上面的脚本.
  3. 对于其他IE版本(9-),我们需要使用XDR.
  4. 在HTTPS方面,URL重写mod在服务器端没有成功.

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

允许第三方cookie的步骤

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

由于这个问题,我们发现在AngularJS版本1.1.1+中,他们通过在'config'模块中设置'withCredentials'值来简化它($ httpProvider.defaults.withCredentials = true;)