【问题标题】:Issue in this.withCredentials attribute in Cross Origin Resource Sharing跨域资源共享中 this.withCredentials 属性中的问题
【发布时间】:2023-03-11 09:18:02
【问题描述】:

我们正在实现一个基于 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>

【问题讨论】:

  • 如果您询问 IE9 或更早版本中的凭据跨源请求,答案是“不支持”。这些浏览器仅通过 XDomainRequest 提供有限的 CORS 支持。
  • 没有。我要IE10+版本

标签: javascript angularjs cors


【解决方案1】:

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

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

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

允许 3rd 方 cookie 的步骤

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

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

【讨论】:

    猜你喜欢
    • 2014-01-18
    • 2011-10-14
    • 1970-01-01
    • 2011-05-07
    • 2012-10-25
    • 2013-01-12
    • 2018-05-04
    • 2011-07-31
    • 2011-03-27
    相关资源
    最近更新 更多