2012-03-11 44 views
18

由于jQuery ajax不适用于CORS/IE,因此我使用XDomainRequest来从另一个服务器中检索数据。工作很好,但我想发送一些标题('验证','内容类型')。IE8/IE9中的跨源头页面

是否有机会在XDomainRequest中添加/更改标题?

还是有人知道解决方法?

回答

17

这就是我们为IE所做的。

如果您拥有对目标域的控制权,那么在那里托管(静态)html文件。使用iframe包含html。

现在,此iframe实际上可以访问本地域,因此您可以在父框与子框之间进行通信以获取所需内容。

这工作很多比我们更好的XDomainRequest。

window.postMessage是搭建沟通的最佳方式:

但我敢肯定,才开始因为IE8工作。如果您还需要旧版浏览器,则必须使用其他黑客技术。

在我们的情况,这是我们的3层系统:

  1. CORS,用于支持它的
  2. 的iframe & window.postMessage作为主备用
  3. 服务器端代理浏览器脚本作为次要备用

所有这些选项都可以正常工作,可靠并且不会像黑客一样感觉太多。次要的倒退几乎没有使用过。

请记住,“身份验证”标题具体是特殊的,我不会感到震惊的是,在某些情况下,它被阻止。我们添加了一个自定义标题'X-Authenticate',因为它一直都在通过。

+0

我看了最后几天的iframe解决方法。但是由于您必须设置'document.domain',它似乎只适用于同一顶级域名(TLD)的两个子域名之间的通信。但是,两个不同的TLD呢? (我可能不得不在周末深入探索代理服务器的东西......) – 2012-03-15 02:07:39

+0

如果iframe与API托管在相同的域上,iframe解决方案*应该可以工作。如果一个代理脚本对你来说是一个解决方案,那么这对你来说可能会更容易。请注意,它通常不是代理服务器,因为它只是一个服务器端代理脚本。 – Evert 2012-03-15 10:43:04

+0

好吧,我使iframe的东西工作。我将一个包含所有信息(标题,后体,...)的对象传递给框架窗口,框架窗口执行请求并返回响应。 :)关于代理脚本:如果我在API服务器上托管脚本,我仍然必须发送带有Ajax标题的请求。那么这个脚本会和'request'页面在同一个服务器上? (= ^客户端)?这样IE允许我发送标题,正文等。并且代理将请求发送到api-server(curl)?!? – 2012-03-18 09:28:05

2

IE的XDomainRequest不允许设置自定义标题。请参阅项目#3:http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx XDomainRequest对象被锁定到很难进行身份验证请求的程度。

+1

但是必须有一个解决方法!?!或者,IE比我想象的更糟? – 2012-03-11 22:05:43

+1

如果没有设置自定义标题或cookie的功能,我不确定是否可以进行经过身份验证的请求。您可以将身份验证凭据作为查询参数传递(我相信OAuth2用户代理流程允许这样做),但这可能不是安全的(并且应该通过SSL完成)。对不起,也许别人有更好的答案:-) – monsur 2012-03-11 22:28:14

+0

我以为你只是需要他们登录到其他域名网站。 (从而设置适当的会话cookie和auth头文件)。那么你的XDomainRequest会使用他们建立的会话?但我可能是错的。 – 2012-03-13 17:33:31