我们正在实现一个基于 AngularJS 的应用程序,它使用托管在不同域中的 rest 网络服务。以下脚本用于 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>
最佳答案
根据我们尝试过的不同场景,我们可以得出以下总结。希望这会有用。
- 根据浏览器规范 IE10+ 和 Safari 4+ 版本 支持 XHR 和 withCredentials 属性。
- 可以像上面的脚本一样毫无问题地用于 CORS。
- 对于其他 IE 版本 (9-),我们需要使用 XDR。
- URL 重写模式在服务器端不成功 来到 HTTPS。
解决方案非常简单。默认情况下,IE 和 Safari 已禁用第 3 方 cookie。由于我们在用户输入凭据登录后使用两个不同的域,因此这些浏览器无法保存该 cookie。因此,所有其他请求都是未经授权的。
允许第 3 方 cookie 的步骤
- IE 10 - Internet 选项 > 隐私 > 高级 > 第三方 Cookie > 接受
- Safari - 首选项 > 隐私 > 阻止 Cookies > 从不
由于这个问题,我们发现在 AngularJS 1.1.1+ 版本中,他们通过在“config”模块中设置“withCredentials”值来简化操作( $httpProvider.defaults.withCredentials = true;)
关于javascript - 跨源资源共享中的 this.withCredentials 属性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19221242/