IE8/9中带有jQuery和XDomainRequest的CORS



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


我正在使用CORS来调用跨域API,但是Internet Explorer给出了问题。CORS应该可以通过XDomainRequest对象在IE8和IE9中实现,但我无法使事情正常工作。。

JQuery拒绝为XDomainRequest提供本机支持,但建议使用几个JQuery插件来添加此支持。本主题建议使用两个这样的插件:jQuery.XDomainRequest.js和xdr.js,据报道这两个插件可以工作。之后,插件应该自动覆盖jQuery.ajax的行为。我在这里找到了另一个插件。

我放了一些演示页面,分别带有插件jQuery.XDomainRequest和xdr以及jQuery.ie.cor,它们对启用cors的服务器执行ajax请求。这些页面在Chrome和Firefox中都可以工作,但IE8/9会立即抛出拒绝权限错误(甚至在发出请求之前)。这篇MSDN文章建议添加另一个处理程序xhr.onprogress = function() {};,但我尝试过,它也不起作用。

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

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

第二版:关于这个故事的结尾,请参阅github上的这一期。事实证明,当使用HTTPPOST时,xDomainRequest只能将请求主体(参数)编码为text/plain。这几乎使它变得毫无价值,因为每个人都使用application/x-www-form-urlencodedmultipart/form-data

POST方法是受支持的,并且要进行跨域https://请求,您的调用页面也需要通过https加载。这是我找到的最好的文章,详细解释了XDomainRequest的这些和其他限制:

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

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

解决方案分为两部分。第一个是一个jquery脚本,它连接到jQueryajax处理中。如果发出跨域请求并且浏览器为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-Urlhttp标头中获取值,然后执行http请求,最后返回结果。

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

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

最新更新