【问题标题】:Making CORS request using Backbone in IE8/9在 IE8/9 中使用 Backbone 发出 CORS 请求
【发布时间】:2013-05-17 00:59:24
【问题描述】:

我正在编写一个将在 app.ourdomain.com/store 上运行的主干应用程序。

我想使用我们 API 中已内置的 HTTP 身份验证访问 api.ourdomain.com/ourApi 上的数据。

现在,据我了解,响应中需要一个 CORS 标头 Access-Control-Allow-Origin: * 以允许跨域支持。

但是,这在 IE8/9 中不起作用。我在 SO 和其他地方读过,我可以简单地添加 $.support.cors = true;,这将神奇地开始在 IE8/9 上运行。

在我深入这个项目之前,我希望有实践经验的人能回答这个问题:

如果我们编写 API 来处理 pre-flight OPTIONS 请求,允许跨域请求,将此覆盖添加到 $.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 身份验证对用户进行身份验证,并在后续请求中使用原始请求期间返回的 access_token。

由于现在强制要求 IE8/9 支持,这是否意味着我不能使用 Backbone 向我们系统上的不同子域请求数据,而不做一些愚蠢的事情,比如在 subdomainA 上创建代理 API 来访问 subdomainB 上的数据?

干杯。

【问题讨论】:

    标签: backbone.js asp.net-web-api cors


    【解决方案1】:

    您的评估听起来是正确的。不幸的是,在 IE8/9 中使用 CORS 时,没有针对自定义标头、附加方法或 cookie 的解决方法(IE10 应该完全支持这些)。

    代理服务器是一种选择。另一种选择是在远程域上托管一个 html 页面,将此 HTML 页面包含在调用页面的 iframe 中,然后使用window.postMessage 在 iframe 和调用页面之间进行对话。由于 iframed 页面与 API 同域,因此可以使用 XHR 发起同源请求,然后使用window.postMessage 将数据传递给调用页面。

    这种“iframe 代理”机制仍然需要对 subdomainB 进行一些黑客攻击,特别是托管 iframe 页面。然而它可能仍然比一个成熟的代理服务器更好,因为它是一个纯 HTML/JavaScript 的解决方案。请注意,IE8/9 仍然有 some restrictionspostMessage(尽管它们似乎不影响 iframe)。您可以在此处找到此“iframe 代理”机制的说明:

    【讨论】:

    • 呜呜呜。为了迎合财富 500 强,我们有很多用户支持 IE8/IE9 (~45%)。另一种解决方案是在我们的应用程序子域上设置一个虚拟目录,该目录指向我们的 api 子域所在的相同代码库,这可能是我们要去的地方......只是不想设置这些虚拟目录在每个想要在内部使用我们的 API 的子域上。
    【解决方案2】:

    看起来这个问题已经回答了,但是遇到了这个问题,我想我会为将来遇到这个问题的人添加这个。

    总之,我遇到了这个确切的问题并编写了一个库,作为 Backbone 的同步的替代品,它使用 XDomainRequest 对象在 IE7/8/9 中启用了 CORS。

    https://github.com/victorquinn/Backbone.CrossDomain

    有了这个,你应该能够在 Backbone.js 之后包含它,进行跨域请求,来自 IE 的请求应该可以正常工作,而无需修改任何其余代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 2015-08-15
      • 1970-01-01
      相关资源
      最近更新 更多