IE8和IE9中的XDomainRequest与XMLHttpRequest有什么区别?

7
我对XMLHttpRequest和XDomainRequest不太清楚,希望能得到一些帮助。以下是我的研究结果:
  1. 在IE8和IE9中,XDomainRequest似乎是XMLHttpRequest的某种子类(?)。
  2. XDomainRequest缺少“withCredentials”。
  3. XDomainRequest缺少“onLoad”事件,强制你使用状态和状态码 - 编辑:这并不完全正确。如果你在IE8和IE9中实例化XDomainRequest,则可以使用onLoad。但如果你在IE8或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进行跨域。但是为什么?这些不是相互矛盾的吗?我只是想让这个问题有意义,因为我担心在某些时候使用XMLHttpRequest在IE8和IE9中可能会有问题。我可以请求一个明确的示例,其中某人可以使用其中一个而不是另一个吗?更好的是,IE8和IE9有没有更新解决这个问题?

任何帮助都将不胜感激Yiannis

2个回答

2

首先注意:

IE11废弃了XDomainRequest对象,并且在IE11 Edge模式下不可用。

1)什么是XDomainRequest,为什么IE有这个对象?几年前,当W3C正在开发XMLHTTPRequest 2规范时,所有浏览器都在XMLHTTPRequest级别2上构建,Microsoft创建了XDomainRequest。因此,XDomainRequest不是子类,而是非标准的IE功能

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

为了防止滥用用户的环境权限(例如cookies、HTTP凭据、客户端证书等),请求将被剥离cookies和凭据,并忽略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

0
but IE8 and IE9 seems to have no problem using the XMLHttpRequest for cross domain

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接