2013-08-06 62 views
7

我很困惑XMLHttpRequest和XDomainRequest轮回,并希望得到一些帮助。因此,这里是我的发现:XDomainRequest对IE8和IE9的XMLHttpRequest

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

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

  • 通过GET加密密钥以及与其关联的会话ID获取(跨域)。
  • 使用使用POST和X WWW的形式,进行了urlencoded的用户名和加密的密码,该键(这里没问题)
  • 登录到跨域(在那里我得到了在步骤1中的密钥)加密我的用户密码。

现在对于所有上述原因,我不能与XDomainRequest做到这一点:

  • 一是因为XDomainRequest:开(方法,URL)只发送纯文本和我的第三方应用程序期待形式(我可以写一个过滤器/请求拦截器,但这不是重点)。
  • 因为我通过Set-Cookie头(第1步)加密密钥到达的会话ID永远不会发回到跨域,因为XDomainRequest不会公开头信息。

然而,如果在IE8和IE9我实例化一个XMLHttpRequest不顾所有这些检查描述here,一切工作正常!好吧,我没有得到onload事件,我不确定“withcredentials”是什么故事,但IE8和IE9似乎没有问题,使用XMLHttpRequest跨域。但为什么?这些矛盾并不全是吗?我只是想解释一下这个问题,因为我担心在IE8和IE9中使用XMLHttpRequest可能会在某个时候回来并咬人。我可以问一个清楚的例子,当有人可以使用这个而不是另一个吗?更好的是,IE8和IE9有没有解决这个问题的更新?

任何帮助,将不胜感激雅尼斯

回答

2

首先说明这一点:

IE11弃用的XDomainRequest对象,它不是在 IE11边缘模式下可用。

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

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

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

4)

作为2014,XDomainRequest似乎不发送任何内容类型 报头。这个变化时我不清楚。

等等等等...... 我只是发表这个答案的历史。

请勿使用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 

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