与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。
另外两个笔记:
- XDomainRequest对象是从IE8引入的,不能在以下版本中使用。
- 从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
非常有用的链接:
可以帮助从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,但是有限的额外编码。
尝试在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);