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

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


我正在使用CORS来调用一个跨域API,但是Internet Explorer正在给出问题。 CORS应该可以在IE8和IE9中通过XDomainRequest对象,但是我不能让事情工作..

JQuery 拒绝为XDomainRequest提供本机支持,但是build议使用几个jQuery插件来增加这种支持。 这个主题提出了两个这样的插件: jQuery.XDomainRequest.js和xdr.js ,已经报道过。 Afaik,插件应该自动覆盖jQuery.ajax行为。 我在这里find了另一个插件。

我把一个小小的演示页面与各自的插件jQuery.XDomainRequest和xdr和jquery.ie.cors执行ajax请求到启用CORS的服务器。 这些页面在Chrome和Firefox中工作,但IE8 / 9立即抛出权限被拒绝的错误(甚至在发出请求之前)。 这MSDN文章build议添加另一个处理程序xhr.onprogress = function() {}; 但我试过这个,它也不工作。

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

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

编辑2:看到这个问题在Github的这个故事的结尾。 事实certificate,使用HTTP POST时,xDomainRequest只能以text/plain对请求主体(参数)进行编码。 这几乎使得它毫无价值,因为每个人都使用application/x-www-form-urlencodedmultipart/form-data

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

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

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

解决scheme分两部分。 第一个是一个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/

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