我对XMLHttpRequest和XDomainRequest转世非常困惑,希望得到一些帮助。以下是我的发现:
- IE8和IE9中的XDomainRequest似乎是某种XMLHttpRequest子类(?)
- XDomainRequest缺少"withCredentials"
- XDomainRequest缺少强制您使用状态和状态IF的"onLoad"事件-EDIT:这并不完全正确。如果在IE8和IE9中实例化XDomainRequest,则onLoad可用。但是,如果在EI8或IE9中实例化XMLHttpRequest,onLoad就不可用。我们将在下面看到为什么这很重要
- 此外,它以纯文本的形式提交数据,而不是以强制您在后端解析输入流的形式提交
- 即使CORS服务器"Allow Headers"指令允许客户端读取Set Cookie,XDomainRequest也不会暴露它,从而无法使用Cookie存储的会话ID进行身份验证
- 最后,如果我没有错的话,它只允许POST和GET http方法,这使得它对RestFull web服务毫无用处
这份清单并不完整,正如我所说,它是基于我的调查结果。然而,这就是混乱的开始。我有一个应用程序,必须通过Ajax:
- 通过GET获得(跨域)加密密钥以及与其关联的会话id
- 使用此密钥加密我的用户密码(此处没有问题)
- 使用POST和x-www-form-urlencoded用户名和加密密码登录到跨域(我在步骤1中获得了密钥)
现在,由于以上所有原因,我无法使用XDomainRequest:进行此操作
- 首先,因为XDomainRequest:open(方法,url)只发送纯文本,而我的第三方应用程序需要表单(我可以编写一个过滤器/请求拦截器,但这不是重点)
- 因为我的会话id通过Set-Cookie标头(步骤1)与加密密钥一起到达,在作为标头登录时永远不会发送回跨域,因为XDomainRequest不会公开标头
然而,如果在IE8和IE9中,我实例化了一个XMLHttpRequest,忽略了这里描述的所有这些检查,那么一切都很好!!!好吧,我没有得到onload事件,我也不确定"withcredentials"是怎么回事,但IE8和IE9使用XMLHttpRequest跨域似乎没有问题。但为什么呢?这些难道不矛盾吗?我只是想弄清楚这个问题,因为我担心在IE8和IE9中使用XMLHttpRequest可能会在某个时候出现问题。当有人可以使用一个而不能使用另一个时,我可以要求一个明确的例子吗?更好的是,IE8和IE9是否有任何更新来解决这个问题?
如有任何帮助,Yiannis 将不胜感激
首先注意:
IE11弃用XDomainRequest对象,该对象在中不可用IE11边缘模式。
1) 什么是XDomainRequest,为什么IE有这个对象?几年前,W3C开发了XMLHTTPRequest 2
规范,所有浏览器都在XMLHTTPRequest
级别1之上构建级别2。微软创建了XDomainRequest
。因此XDomainRequest不是一个子类,这是一个非标准的IE功能。
2) 是的,XDomainRequest缺少"withCredentials"。因为:
为了防止滥用用户的环境权限(例如Cookie、HTTP凭据、客户端证书等),请求将被剥夺Cookie和凭据,并将忽略HTTP响应中的任何身份验证挑战或设置Cookie指令。XDomainRequest将不会在以前经过身份验证的连接上发送,因为某些Windows身份验证协议(例如NTLM/Kerberos)是基于每个连接而不是基于每个请求的。
4)
截至2014年,XDomainRequest似乎没有发送任何内容类型头。我不清楚这是什么时候改变的。
等等等等。。。我发布这个答案只是为了历史。
不要使用XDomainRequest。这是丑陋的&错误的非标准功能
更多信息请点击此处:
- http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
- http://www.html5rocks.com/en/tutorials/cors/
- http://msdn.microsoft.com/en-us/library/ie/cc288060%28v=vs.85%29.aspx
- https://developer.mozilla.org/en-US/docs/Web/API/XDomainRequest
but IE8 and IE9 seems to have no problem using the XMLHttpRequest for cross domain
这一点不正确。在IE8/9中发送CORS的唯一方法是使用非标准的XDomainRequest。