在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-urlencoded
或multipart/form-data
。
支持POST方法,并且要使跨域https://请求您的调用页面也需要通过https加载。 这是我find的最好的文章,详细解释了XDomainRequest的这些和其他限制:
我写了一个代理,如果使用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
- Access-Control-Allow-Origin头文件如何工作?
- 了解AJAX CORS和安全性考虑
- 一个CORS POST请求从普通的javascript工作,但为什么不与jQuery?
- chrome中的错误:Content-Type不被Access-Control-Allow-Headers所允许
- 如何使用JAX-RS和Jersey处理CORS
- 在尝试从REST API获取数据时,请求的资源上没有“Access-Control-Allow-Origin”标头
- 处理CORS预检请求到ASP.NET MVC操作
- 为什么需要Access-Control-Expose-Headers?
- 何时安全启用CORS?