XDomainRequest对IE8和IE9上的XMLHttpRequest

时间:2013-08-06 10:09:16

标签: javascript xmlhttprequest cross-domain xdomainrequest

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

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

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

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

    • 首先是因为XDomainRequest:open(方法,url)只发送纯文本而我的第三方应用程序需要表单(我可以写一个过滤器/请求拦截器,但这不是重点)。
    • 因为我的会话ID通过Set-Cookie标头(步骤1)使用加密密钥到达时,从来没有作为标头登录时发送回跨域,因为XDomainRequest不公开标题。

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

    任何帮助将非常感谢Yiannis

2 个答案:

答案 0 :(得分:2)

首先请注意:

  

IE11弃用了XDomainRequest对象,但它不可用   IE11边缘模式。

1)什么是XDomainRequest以及为什么IE有此对象?几年前,W3C正在开发XMLHTTPRequest 2规范所有浏览器构建级别2超过XMLHTTPRequest级别1 Microsoft创建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

答案 1 :(得分:0)

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

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