与CORS的IE9 jQuery AJAX返回“访问被拒绝”

以下在所有浏览器中工作, 除了IE浏览 (我正在testing在IE 9)。

jQuery.support.cors = true; ... $.ajax( url + "messages/postMessageReadByPersonEmail", { crossDomain: true, data: { messageId : messageId, personEmail : personEmail }, success: function() { alert('marked as read'); }, error: function(a,b,c) { alert('failed'); }, type: 'post' } ); 

我有另一个使用dataType: 'jsonp'函数dataType: 'jsonp' ,但我不需要在这个AJAX调用返回任何数据。 我最后的手段是返回一些JSONP包装的乱码,以使其工作。

任何想法,为什么IE浏览器搞砸了CORS请求,没有数据返回?

这是jQuery的一个已知的错误 。 jQuery团队“没有计划在核心中支持这一点,更适合作为插件”。 (看这个评论 ) IE不使用XMLHttpRequest ,而是一个名为XDomainRequest的替代对象。

有一个插件可以在jQuery中支持这个, 可以在这里find : https : //github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js

编辑 $.ajaxTransport函数注册一个转运工厂。 一个传输器被$.ajax 内部用来执行请求。 因此,我认为你应该可以像往常一样调用$.ajax 。 有关运输商和扩展$.ajax可以在这里find。

另外,这个插件的更好的版本可以在这里find。

另外两个笔记:

  1. XDomainRequest对象是从IE8引入的,不能在以下版本中使用。
  2. 从IE10 CORS将被支持使用正常的XMLHttpRequest 。

编辑2:http到https问题

请求必须针对与托pipe页面相同的scheme

此限制意味着如果您的AJAX页面位于http://example.com ,那么您的目标URL也必须以HTTP开头。 同样,如果您的AJAX页面位于https://example.com ,那么您的目标URL也必须以HTTPS开头。

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

build立在@dennisg接受的答案,我成功地使用MoonScript的jQuery.XDomainRequest.js成功。

以下代码在Chrome,Firefox和IE10中正常工作,但在IE9中失败。 我只是简单地包含了脚本,现在它自动在IE9中工作。 (可能8,但我没有testing过。)

 var displayTweets = function () { $.ajax({ cache: false, type: 'GET', crossDomain: true, url: Site.config().apiRoot + '/Api/GetTwitterFeed', contentType: 'application/json; charset=utf-8', dataType: 'json', success: function (data) { for (var tweet in data) { displayTweet(data[tweet]); } } }); }; 

有关如何使用“jQuery-ajaxTransport-XDomainRequest”插件完成此操作的完整说明,请访问: https : //github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions

这个插件是积极支持,并处理HTML,JSON和XML。 该文件也托pipe在CDNJS上,因此您可以直接将脚本拖放到您的页面中,无需其他设置: http : //cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest .min.js

问题是IE9及以下版本不支持CORS。 XDomainRequest只支持GET / POST和text/plain conten-type,如下所述: http : //blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds的.aspx

所以如果你想使用所有的HTTP动词和/或JSON等你必须使用另一种解决scheme。 我写了一个代理,如果使用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/

我只是提出所有请求JSONP,因为它是我们所有支持的浏览器(IE7 +和常客)的唯一解决scheme。 请注意,你的答案技术上适用于IE9,所以你有正确的答案。

在Internet Explorer 8和更新版本中使用jQuery获取跨域JSON

非常有用的链接:

http://graphicmaniacs.com/note/getting-a-cross-domain-json-with-jquery-in-internet-explorer-8-and-later/

可以帮助从X域请求返回json的麻烦。

希望这有助于某人。

在MoonScript的解决scheme的基础上,你可以试试这个:

intuit/xhr-xdr-adapter/blob/master/src/xhr-xdr-adapter.html

好处是,由于它是一个较低级别的解决scheme,它将使IE 8/9上的CORS(尽可能)与其他框架(而不仅仅是jQuery)相关联。 我已经成功地使用它与AngularJS,以及jQuery 1.x和2.x.

为了解决这个问题,还要检查一下你的ajax文件中是否包含了一些名为.js的文件,其中包括我在ajax.php中包含shadowbox.js时发生的访问被拒绝错误

我在我的开发机器上testing了一个CORS Web服务,并且在IE中得到了“访问被拒绝”的错误信息。 Firefox和Chrome工作正常。 原来这是由于我在ajax调用中使用本地主机造成的! 所以我的浏览器URL是这样的:

HTTP://my_computer.my_domain.local/CORS_Service/test.html

和我的ajax调用test.html里面是这样的:

 //fails in IE $.ajax({ url: "http://localhost/CORS_Service/api/Controller", ... }); 

一切工作,我改变了Ajax调用使用我的电脑IP而不是本地主机。

 //Works in IE $.ajax({ url: "http://192.168.0.1/CORS_Service/api/Controller", ... }); 

IE开发工具窗口“networking”选项卡还显示了CORS预检选项请求,然后是XMLHttpRequest GET,这正是我期望看到的。

更新至2015年初。xDomain是一个广泛使用的库,用于支持IE9上的CORS,但是有限的额外编码。

https://github.com/jpillora/xdomain

尝试在IE8 / 9中使用jquery-transport-xdr jQuery插件来处理CORS请求。

注 – 注意

在Ajax中不要使用“ http://www.domain.xxx ”或“ http:// localhost / ”或“IP >> 127.0.0.1”。 只使用path(目录)和没有地址的页面名称。

错误状态:

 var AJAXobj = createAjax(); AJAXobj.onreadystatechange = handlesAJAXcheck; AJAXobj.open('POST', 'http://www.example.com/dir/getSecurityCode.php', true); AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); AJAXobj.send(pack); 

真实状态:

 var AJAXobj = createAjax(); AJAXobj.onreadystatechange = handlesAJAXcheck; AJAXobj.open('POST', 'dir/getSecurityCode.php', true); // <<--- note AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); AJAXobj.send(pack);