在IE8 / 9中使用jQuery和XDomainRequest的CORS

时间:2012-07-14 20:37:13

标签: jquery internet-explorer-9 cors xdomainrequest

更新:我强烈建议不要在XDomainRequest中投入任何时间,因为它是一个非常糟糕的实现,有很多限制。它基本上只适用于对非ssl服务器的GET请求,所以你不妨使用jsonp或其他。


我使用CORS来调用跨域API,但Internet Explorer提出了问题。通过XDomainRequest对象在IE8和IE9中应该可以使用CORS,但是我无法使用它。

JQuery refuses为XDomainRequest提供本机支持,但是建议使用几个jQuery插件来添加此支持。这个topic提示了两个这样的插件:jQuery.XDomainRequest.jsxdr.js,据报道它们起作用。 Afaik,插件应该自动覆盖jQuery.ajax的行为。我找到了另一个插件here

我将一些演示页面与相应的插件jQuery.XDomainRequestxdr以及jquery.ie.cors放在一起,对启用CORS的服务器执行ajax请求。这些页面在Chrome和Firefox中运行,但IE8 / 9会立即抛出权限被拒绝错误(甚至在发出请求之前)。这个MSDN post建议添加另一个处理程序xhr.onprogress = function() {};,但我尝试了这个并且它也没有用。

任何线索我做错了什么?我现在也使用MS虚拟服务器测试IE8,但它有完全相同的问题。

编辑:好的,所以我发现问题的一部分是我通过HTTPS使用POST。显然XDomainRequest不允许通过HTTPS使用CORS。我可以切换到HTTP,但我真的需要POST。

Edit2:有关此故事的结尾,请参阅this issue on github。事实证明,当使用HTTP POST时,xDomainRequest只能将请求体(参数)编码为text/plain。这几乎使它变得毫无价值,因为每个人都使用application/x-www-form-urlencodedmultipart/form-data

3 个答案:

答案 0 :(得分:28)

支持POST方法,并且要建立跨域https://请求,您的呼叫页面也需要通过https加载。这是我发现的最好的文章,它详细解释了XDomainRequest的这些和其他限制:

http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

答案 1 :(得分:5)

我已经编写了一个代理,如果使用IE9或更低版本,它将优雅地降级到代理。如果使用ASP.NET,则根本不需要更改代码。

解决方案分为两部分。第一个是jquery脚本,它挂钩到jQuery ajax处理。如果发出了跨域请求并且浏览器是IE,它将自动调用Web服务器:

$.ajaxPrefilter(function (options, originalOptions, jqXhr) {
    if (!window.CorsProxyUrl) {
        window.CorsProxyUrl = '/corsproxy/';
    }
    // only proxy those requests
    // that are marked as crossDomain requests.
    if (!options.crossDomain) {
        return;
    }

    if (getIeVersion() && getIeVersion() < 10) {
        var url = options.url;
        options.beforeSend = function (request) {
            request.setRequestHeader("X-CorsProxy-Url", url);
        };
        options.url = window.CorsProxyUrl;
        options.crossDomain = false;
    }
});

在您的Web服务器中,您必须接收请求,从X-CorsProxy-Url http标头获取值并执行HTTP请求,最后返回结果。

我的博文:http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/

答案 2 :(得分:0)

对于IE8 / 9中的 CORS 请求,您可以使用jQuery插件jquery-transport-xdr