IE8/IE9 中的跨域标头
Posted
技术标签:
【中文标题】IE8/IE9 中的跨域标头【英文标题】:cross-origin header in IE8/IE9 【发布时间】:2012-03-27 23:37:44 【问题描述】:由于 jQuery ajax 不适用于 CORS/IE,我使用 XDomainRequest
从另一台服务器检索数据。工作正常,但我想发送一些标头('Authentification'、'content-type')。
是否有机会在 XDomainRequest 中添加/更改标头?
或者有人知道解决方法吗?
【问题讨论】:
【参考方案1】:IE 的 XDomainRequest 不允许设置自定义标头。请参阅此处的第 3 项:http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx XDomainRequest 对象被锁定到难以发出经过身份验证的请求的程度。
【讨论】:
但是必须有解决方法!?!还是 IE 比我想象的更糟糕? 如果无法设置自定义标头或 cookie,我不确定发出经过身份验证的请求的好方法。您可以将身份验证凭据作为查询参数传递(我相信 OAuth2 用户代理流程允许这样做),但这可能不那么安全(应该通过 SSL 完成)。抱歉,也许其他人有更好的答案:-) 我以为您只需要他们登录到其他域站点。 (从而设置适当的会话 cookie 和身份验证标头)。那么您的 XDomainRequest 会使用他们建立的会话吗?不过我可能错了。 @JohannesStaehlin 是的,IE 比你想象的还要糟糕。不管你怎么想;比那更糟。【参考方案2】:这就是我们为 IE 所做的。
如果您可以控制目标域,请在其中托管一个(静态)html 文件。使用 iframe 包含 html。
现在这个 iframe 确实可以访问本地域,因此您可以在父框架和子框架之间进行通信以获得所需的内容。
这对我们来说比 XDomainRequest 效果好多。
window.postMessage 是设置通信的最佳方式:
但我很确定它是从 IE8 开始工作的。如果您还需要旧版浏览器,则必须使用不同的 hack。
在我们的例子中,这是我们的 3 层系统:
-
CORS,适用于支持它的浏览器
iframe 和 window.postMessage 作为主要后备
作为辅助后备的服务器端代理脚本
所有这些选项都运行良好、可靠且不会让人觉得太像黑客。次要后备几乎从未使用过。
请记住,“身份验证”标头是特殊的,无论如何,在某些情况下它被阻止我不会感到震惊。我们添加了一个自定义标头“X-Authenticate”,因为它一直通过。
【讨论】:
前几天我查看了 iframe 解决方法。但由于您必须设置“document.domain”,它似乎只适用于同一 TLD 的两个子域之间的通信。但是两个不同的***域名呢? (我可能不得不在周末更深入地研究代理服务器的东西......) 如果 iframe 与 API 托管在同一域中,则 iframe 解决方案应该工作。如果代理脚本是您的解决方案,那么对于您的目的来说,这可能会很多更容易。请注意,它(通常)与其说是代理服务器,不如说它只是一个服务器端代理脚本。 好的,我让 iframe 的东西工作了。我将一个包含所有信息(标题、post-body、...)的对象传递给框架窗口,框架窗口执行请求并返回响应。 :) 关于代理脚本:如果我在 API-Server 上托管脚本,我仍然需要在 Ajax 中发送带有标头的请求。所以脚本将与“请求”页面位于同一台服务器上? (=^ 客户)?这种方式 IE 允许我发送标题、正文等。并且代理将请求发送到 api-server (curl)?!? 是的,如果是代理脚本,它必须与“调用页面”位于同一域中。以上是关于IE8/IE9 中的跨域标头的主要内容,如果未能解决你的问题,请参考以下文章
发送带有自定义 HTTP 标头的跨域请求时禁用预检 OPTION 请求
具有自定义标头和请求正文作为 JSON 字符串的跨域 jquery ajax 请求