我正在写一个主干应用程序,它将存在于app.ourdomain.com/store上。
我想访问api.ourdomain.com/ourApi上的数据,使用已经内置到API中的HTTP身份验证。
现在,据我所知,响应中需要一个CORS头Access-Control-Allow-Origin: *来支持这种跨域支持。
但是,这在IE8/9中不起作用。我在其他地方读到过,我可以简单地添加$.support.cors = true;,这将神奇地开始在IE8/9上工作。
在我深入这个项目之前,我希望有实际经验的人能回答这个问题:
如果我们编写API来处理飞行前选项请求,允许跨源请求,并将此覆盖添加到$.support对象,那么我们是否会获得对所有HTTP谓词(包括PUT/DELETE)的完全访问权限,身份验证的能力,并在IE8/9中包含自定义头(就像我们在所有使用XMLHttpRequest的现代浏览器中所做的那样)?
This article描述了IE8/9用于这类请求的XDomainRequest对象的限制/限制。我特别关注#3和#5,这说明:
#3: No custom headers may be added to the request我们使用自定义标头来指示发出请求的CustomerID
#5: No authentication or cookies will be sent with the request我们使用HTTP Authentication对初始请求的用户进行身份验证,并在后续请求中使用在原始请求期间返回的access_token。
既然现在强制支持IE8/9,这是不是意味着我不能使用Backbone向我们系统上的不同子域请求数据,而不做一些愚蠢的事情,比如在subdomainA上创建一个代理API来访问subdomainB上的数据?
干杯。
发布于 2013-01-19 04:47:34
你的评估听起来是对的。不幸的是,在IE8/9中使用CORS时,没有针对自定义标头、附加方法或cookies的变通方法(IE10应该完全支持这些)。
代理服务器是一种选择。另一种选择是在远程域上托管一个html页面,将此HTML页面包含在调用页面上的iframe中,然后使用window.postMessage在iframe和调用页面之间进行对话。由于iframed页面与API在同一个域中,因此它可以使用XHR发出同源请求,然后使用window.postMessage将数据传递给调用页面。
这种"iframe代理“机制仍然需要在subdomainB上进行一些黑客攻击,特别是为了托管iframed页面。然而,它可能仍然比成熟的代理服务器更好,因为它是一个纯粹的基于HTML/JavaScript的解决方案。请注意,IE8/9仍然具有带有postMessage的some restrictions (尽管它们似乎不影响iframe)。你可以在这里找到这个"iframe代理“机制的描述:
发布于 2013-05-17 00:59:25
看起来这个问题已经得到了回答,但是偶然遇到了这个问题,我想我会为将来遇到这个问题的人添加这个。
总之,我遇到了这个问题,并编写了一个库,作为Backbone同步的临时替代品,它使用XDomainRequest对象在IE7/8/9中启用CORS。
https://github.com/victorquinn/Backbone.CrossDomain
有了它,你应该能够在Backbone.js之后立即包含它,做你的跨域请求,这些来自IE的请求应该可以工作,而不需要修改任何剩余的代码。
https://stackoverflow.com/questions/14406793
复制相似问题