7

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

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

任何帮助将不胜感激 Yiannis

4

2 回答 2

2

首先注意这一点:

IE11 不推荐使用 XDomainRequest 对象,并且它在 IE11 Edge 模式下不可用。

1) 什么是 XDomainRequest,为什么 IE 有这个对象?几年前XMLHTTPRequest 2,W3C 开发了所有浏览器构建级别 2 超过XMLHTTPRequest级别 1 的规范,微软创建了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-12-03T10:25:40.737 回答
0
but IE8 and IE9 seems to have no problem using the XMLHttpRequest for cross domain

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

于 2015-03-18T00:43:15.710 回答