我对 XMLHttpRequest 和 XDomainRequest 转世感到非常困惑,希望得到一些帮助。所以这是我的发现:
- IE8 和 IE9 中的 XDomainRequest 似乎是某种 XMLHttpRequest 子类(?)
- XDomainRequest 缺少“withCredentials”
- XDomainRequest 缺少强制您使用状态和状态 IF 的“onLoad”事件 - 编辑:这不完全正确。如果您在 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(method, url) 只发送纯文本,而我的第三方应用程序正在等待表单(我可以编写一个过滤器/请求拦截器,但这不是重点)。
- 因为通过 Set-Cookie 标头(步骤 1)与加密密钥一起到达的我的会话 ID 在作为标头登录时永远不会发送回跨域,因为 XDomainRequest 不公开标头。
然而,如果在 IE8 和 IE9 中我实例化一个 XMLHttpRequest 忽略此处描述的所有这些检查,一切正常!!!好的,我没有收到 onload 事件,我不确定“withcredentials”的故事是什么,但 IE8 和 IE9 似乎在跨域使用 XMLHttpRequest 时没有问题。但为什么?这些不都是矛盾的吗?我只是想弄明白这个问题,因为我担心在 IE8 和 IE9 中使用 XMLHttpRequest 可能会在某个时候回来咬人。当有人可以使用一个而不是另一个时,我可以要求一个明确的例子吗?更好的是,是否有任何针对 IE8 和 IE9 的更新解决了这个问题?
任何帮助将不胜感激 Yiannis