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

Jer*_*oen 62 jquery cors internet-explorer-9 xdomainrequest

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


我使用CORS来调用跨域API,但Internet Explorer提出了问题.通过XDomainRequest对象在IE8和IE9中应该可以使用CORS ,但是我无法使用它.

JQuery 拒绝为XDomainRequest提供本机支持,但是建议使用几个jQuery插件来添加此支持.本主题提出了两个这样的插件:jQuery.XDomainRequest.jsxdr.js,已经报告可以使用.Afaik,插件应该自动覆盖行为jQuery.ajax.我在这里找到了另一个插件.

我把一些演示页面与相应的插件jQuery.XDomainRequest以及xdrjquery.ie.cors放在一起,它们对启用CORS的服务器执行ajax请求.这些页面在Chrome和Firefox中运行,但IE8/9会立即抛出权限被拒绝错误(甚至在发出请求之前).这个MSDN帖子建议添加另一个处理程序,xhr.onprogress = function() {};但我尝试了这个,它也没有工作.

什么线索我做错了什么?我现在也使用MS8虚拟服务器测试IE8,但它有完全相同的问题.

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

编辑2:本故事结束时,请在github上查看此问题.事实证明,当使用HTTP POST时,xDomainRequest只能将请求体(参数)编码为text/plain.这几乎使它变得毫无价值,因为每个人都使用application/x-www-form-urlencodedmultipart/form-data.

Ada*_*der 28

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

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

  • text/plain限制使这个对象完全没用.微软恕我直言,完全浪费了编程工作. (7认同)
  • 这是一篇很好的文章,有几个陷阱.我过去曾多次提到它.经常出现的另一个问题是:"请求的Content-Type标头仅支持text/plain" (5认同)
  • 至少对于 JSON API 等常见用例,它并不像听起来那么糟糕。Web 应用程序可以使用 XDomainRequest 将 JSON 数据作为文本/纯文本发送。服务器端逻辑只需要知道接受使用该 Content-Type 发送的 JSON。由于 CORS 支持已经需要在服务器端进行一些更改,因此不需要太多额外的工作。 (2认同)

jga*_*fin 5

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

解决方案分为两部分.第一个是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;
    }
});
Run Code Online (Sandbox Code Playgroud)

在您的Web服务器中,您必须接收请求,从X-CorsProxy-Urlhttp标头获取值并执行HTTP请求,最后返回结果.

我的博文:http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/