【问题标题】:XDomainRequest Vs XMLHttpRequest on IE8 and IE9IE8 和 IE9 上的 XDomainRequest 与 XMLHttpRequest
【发布时间】:2013-08-07 06:47:16
【问题描述】:

我对 XMLHttpRequest 和 XDomainRequest 的转世感到非常困惑,希望得到一些帮助。所以这是我的发现:

  1. IE8 和 IE9 中的 XDomainRequest 似乎是某种 XMLHttpRequest 子类(?)
  2. XDomainRequest 缺少“withCredentials”
  3. XDomainRequest 缺少强制您使用状态和状态 IF 的“onLoad”事件 - 编辑:这并不完全正确。如果您在 IE8 和 IE9 中实例化 XDomainRequest,则 onLoad 可用。但是,如果您在 EI8 或 IE9 中实例化 XMLHttpRequest,则 onLoad 不可用。我们将在下面看到为什么这很重要。
  4. 此外,它以纯文本/文本形式提交数据,而不是强制您在后端解析输入流的形式。
  5. 即使 CORS 服务器“Allow-Headers”指令允许客户端读取 Set-Cookie,XDomainRequest 也不会公开它,因此无法使用 cookie 存储的会话 ID 用于身份验证。
  6. 最后,如果我没记错的话,它只允许 POST 和 GET http 方法,使其对 RestFull Web 服务无用。

此列表绝不是完整的,正如我所说,它是基于我的发现。然而,这就是混乱开始的地方。我有一个应用程序,我必须通过 Ajax:

  • 通过 GET 获取(跨域)加密密钥以及与之关联的会话 ID。
  • 使用此密钥加密我的用户密码(这里没问题)
  • 使用 POST 和 x-www-form-urlencoded 用户名和加密密码登录到跨域(我在步骤 1 中获得了密钥)。

由于以上所有原因,我无法使用 XDomainRequest 执行此操作:

  • 首先因为 XDomainRequest:open(method, url) 仅发送纯文本,而我的第三方应用程序正在等待表单(我可以编写过滤器/请求拦截器,但这不是重点)。
  • 因为我的会话 ID 通过 Set-Cookie 标头(第 1 步)与加密密钥一起到达时,在作为标头登录时永远不会发送回跨域,因为 XDomainRequest 不公开标头。

尽管如此,如果在 IE8 和 IE9 中我实例化了一个 XMLHttpRequest,而忽略了here 中描述的所有这些检查,一切正常!!!好的,我没有收到 onload 事件,我不确定“withcredentials”的故事是什么,但 IE8 和 IE9 似乎在跨域使用 XMLHttpRequest 时没有问题。但为什么?这些不都是矛盾的吗?我只是想对这个问题有所了解,因为我担心在 IE8 和 IE9 中使用 XMLHttpRequest 可能会在某个时候卷土重来。当有人可以使用一个而不是另一个时,我可以要求一个明确的例子吗?更好的是,是否有任何 IE8 和 IE9 更新解决了这个问题?

任何帮助将不胜感激 Yiannis

【问题讨论】:

    标签: javascript xmlhttprequest cross-domain xdomainrequest


    【解决方案1】:
    but IE8 and IE9 seems to have no problem using the XMLHttpRequest for cross domain
    

    这点不正确。在IE8/9中发送CORS的唯一方法是使用非标准的XDomainRequest。

    【讨论】:

      【解决方案2】:

      首先注意这一点:

      IE11 不推荐使用 XDomainRequest 对象,并且它在 IE11 边缘模式。

      1) 什么是 XDomainRequest,为什么 IE 有这个对象?几年前,XMLHTTPRequest 2 规范由 W3C 开发,所有浏览器在XMLHTTPRequest 级别 1 上构建级别 2 微软创建了XDomainRequest。所以XDomainRequest 不是子类,这是一个非标准的 IE 特性

      2) 是的,XDomainRequest 缺少“withCredentials”。因为:

      为了防止滥用用户的环境权限(例如 cookie、HTTP 凭据、客户端证书等),请求将被剥离 cookie 和凭据,并将忽略 HTTP 响应中的任何身份验证挑战或 Set-Cookie 指令. XDomainRequests 不会在先前经过身份验证的连接上发送,因为某些 Windows 身份验证协议(例如 NTLM/Kerberos)是基于每个连接而不是基于每个请求的。

      4)

      截至 2014 年,XDomainRequest 似乎没有发送任何 Content-Type 头。我不清楚这是什么时候改变的。

      等等等等…… 我发布这个答案只是为了历史。

      不要使用 XDomainRequest。这是丑陋且错误的非标准功能。

      更多信息在这里:

      1. http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
      2. http://www.html5rocks.com/en/tutorials/cors/
      3. http://msdn.microsoft.com/en-us/library/ie/cc288060%28v=vs.85%29.aspx
      4. https://developer.mozilla.org/en-US/docs/Web/API/XDomainRequest

      【讨论】:

        猜你喜欢
        • 2014-09-28
        • 1970-01-01
        • 1970-01-01
        • 2014-01-04
        • 2014-03-03
        • 1970-01-01
        • 2012-07-14
        • 2013-04-12
        • 1970-01-01
        相关资源
        最近更新 更多