- 在IE8和IE9中,XDomainRequest似乎是XMLHttpRequest的某种子类(?)。
- XDomainRequest缺少“withCredentials”。
- XDomainRequest缺少“onLoad”事件,强制你使用状态和状态码 - 编辑:这并不完全正确。如果你在IE8和IE9中实例化XDomainRequest,则可以使用onLoad。但如果你在IE8或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(method,url)仅发送纯文本,而我的第三方应用程序正在等待表单(我可以编写过滤器/请求拦截器,但这不是重点)。
- 因为我的会话ID通过Set-Cookie头(步骤1)到达时,从未作为标头发送回跨域,因为XDomainRequest不公开标头。
然而,如果我在IE8和IE9中实例化XMLHttpRequest,忽略了所有这些检查 here,一切都很顺利!好吧,我没有得到onload事件,也不确定“withcredentials”的故事是什么,但是IE8和IE9似乎没有问题,可以使用XMLHttpRequest进行跨域。但是为什么?这些不是相互矛盾的吗?我只是想让这个问题有意义,因为我担心在某些时候使用XMLHttpRequest在IE8和IE9中可能会有问题。我可以请求一个明确的示例,其中某人可以使用其中一个而不是另一个吗?更好的是,IE8和IE9有没有更新解决这个问题?
任何帮助都将不胜感激Yiannis