我们正在实现一个基于 AngularJS 的应用程序,该应用程序使用托管在不同域中的 REST Web 服务。以下脚本用于 CORS,它在 Chrome 和 FireFox 上完美运行。在 IE9 和 Safari 中进行身份验证时存在问题。看来问题出在带有凭据这些浏览器中的属性。 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 重写 mod 在服务器端未成功
来到 HTTPS。
解决方案非常简单。默认情况下,IE 和 Safari 已禁用第 3 方 cookie。由于一旦用户输入凭据进行登录,我们就会使用两个不同的域,因此这些浏览器无法保存该 cookie。因此,所有其他请求均未经授权。
允许第 3 方 cookie 的步骤
- IE 10 - Internet 选项 > 隐私 > 高级 > 第三方 Cookie >
接受
- Safari - 首选项 > 隐私 > 阻止 Cookie > 从不
由于这个问题,我们发现在 AngularJS 1.1.1+ 版本中,他们通过在“config”模块中设置“withCredentials”值来轻松实现这一点(
$httpProvider.defaults.withCredentials = true;)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)