IE8/9中带有jQuery和XDomainRequest的CORS
更新:我强烈建议不要在XDomainRequest上投入任何时间,因为它是一个非常糟糕的实现,有很多限制。它基本上只对非ssl服务器的GET请求有效,所以您也可以使用jsonp或其他什么IE8/9中带有jQuery和XDomainRequest的CORS,jquery,internet-explorer-9,xdomainrequest,Jquery,Internet Explorer 9,Xdomainrequest,更新:我强烈建议不要在XDomainRequest上投入任何时间,因为它是一个非常糟糕的实现,有很多限制。它基本上只对非ssl服务器的GET请求有效,所以您也可以使用jsonp或其他什么 我正在使用CORS调用跨域API,但Internet Explorer出现了一些问题。CORS应该可以通过XDomainRequest对象在IE8和IE9中实现,但是我无法让它正常工作 JQuery将为XDomainRequest提供本机支持,但是建议使用几个JQuery插件来添加此支持。这表明有两个这样的插
我正在使用CORS调用跨域API,但Internet Explorer出现了一些问题。CORS应该可以通过
XDomainRequest
对象在IE8和IE9中实现,但是我无法让它正常工作
JQuery将为XDomainRequest提供本机支持,但是建议使用几个JQuery插件来添加此支持。这表明有两个这样的插件:和,据报道这两个插件可以工作。好的,插件应该自动覆盖jQuery.ajax
的行为。我找到了另一个插件
我放了一个小的演示页面,其中包含了相应的插件,并向启用CORS的服务器执行ajax请求。这些页面在Chrome和Firefox中工作,但是IE8/9会立即抛出一个权限拒绝错误(甚至在发出请求之前)。这建议添加另一个处理程序xhr.onprogress=function(){}代码>但是我试过了,它也不起作用
有什么线索表明我做错了什么吗?我还使用MS virtual server测试了IE8,但它也有完全相同的问题
编辑:好的,所以我发现问题的一部分是我在HTTPS上使用POST。显然,XDomainRequest不允许通过HTTPS进行CORS。我可以切换到HTTP,但我真的需要POST
编辑2:请看这个故事的结尾。事实证明,当使用HTTPPOST时,xDomainRequest只能将请求体(参数)编码为text/plain
。这几乎使它一文不值,因为每个人都使用application/x-www-form-urlencoded
或multipart/form data
POST方法是受支持的,要进行跨域https://请求,您的调用页面也需要通过https加载。这是我找到的最好的一篇文章,详细解释了XDomainRequest的这些和其他限制:
我编写了一个代理,如果使用IE9或更低版本,它将优雅地降级为代理。如果使用ASP.NET,则根本不必更改代码
解决方案分为两部分。第一个是一个jquery脚本,它与jQueryAjax处理挂钩。如果发出跨域请求且浏览器为IE:
$.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;
}
});
$.ajaxPrefilter(函数(选项、原始选项、jqXhr){
如果(!window.CorsProxyUrl){
window.CorsProxyUrl='/corsproxy/';
}
//只代理那些请求
//标记为跨域请求的。
如果(!options.crossDomain){
返回;
}
if(getIeVersion()&&getIeVersion()<10){
var url=options.url;
options.beforeSend=函数(请求){
setRequestHeader(“X-CorsProxy-Url”,Url);
};
options.url=window.CorsProxyUrl;
options.crossDomain=false;
}
});
在web服务器中,您必须接收请求,从X-CorsProxy-Url
http头获取值,然后执行http请求并最终返回结果
我的博客帖子:对于IE8/9中的CORS请求,您可以使用jQuery插件Microsoft为IE8提供免费虚拟图像,因此如果您有bandwith,您将能够获得它。(只是一个提示)有一个简单的技巧可以让jQuery CORS ajax在IE8中工作。。。我想你可以通过搜索相关问题的答案在StackOverflow上找到它。更多信息,请参阅更新的自述文件,包括一个正在运行的JSFIDLE示例:上面的链接应该是:这个问题来自2013年!DIE IE8/9。这是一篇好文章,有几个缺点。我过去曾多次提到过它。另一个经常出现的问题是:“请求的内容类型头只支持text/plain”text/plain限制使得这个对象毫无价值。微软方面的编程工作完全是浪费。至少对于JSON API这样的常见用例来说,这并不像听起来那么糟糕。web应用程序可以使用XDomainRequest以文本/普通格式发送JSON数据。服务器端逻辑只需要知道如何接受与该内容类型一起发送的JSON。由于CORS支持已经需要在服务器端进行一些更改,因此这并不需要太多额外的工作。这只是围绕相同的XDomainRequest
方法的jQuery包装。它没有解决上述任何限制。