IE9 jQuery AJAX with CORS 返回"Access is denied"



以下内容适用于除IE以外的所有浏览器(我正在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' 的函数,但我不需要在此 AJAX 调用中返回任何数据。我最后的手段是返回一些包裹在 JSONP 中的乱码,只是为了让它工作。

知道为什么IE搞砸了一个不返回数据的CORS请求吗?

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

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

编辑该函数$.ajaxTransport注册运输机工厂。$.ajax在内部使用传输器来执行请求。因此,我认为您应该能够像往常一样打电话给$.ajax。有关运输商和扩展$.ajax的信息可以在这里找到。

此外,可以在此处找到此插件的更好版本。

另外两个注意事项:

  1. 对象 XDomainRequest 是从 IE8 引入的,在下面的版本中不起作用。
  2. 从IE10开始,将使用普通的XMLHttpRequest支持CORS程序。

编辑 2:http 到 https 问题

请求必须针对与托管页面相同的方案

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

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

在@dennisg接受的答案的基础上,我使用 MoonScript 的 jQuery.XDomainRequest.js 成功完成了此操作。

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

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。 该文件也托管在 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等,则必须使用另一种解决方案。我写了一个代理,如果使用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;
    }
});

在你的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 +和常规浏览器)的唯一解决方案。请注意,您的答案在技术上适用于IE9,因此您有正确的答案。

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

https://github.com/intuit/xhr-xdr-adapter/blob/master/src/xhr-xdr-adapter.js

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

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

非常有用的链接:

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

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

希望这对某人有所帮助。

要解决此问题,还要检查您的 ajax 文件中是否包含了一些.js,称为:在我的 ajax.php

>

我正在开发计算机上测试 CORS Web 服务,并且仅在 IE 中收到"访问被拒绝"错误消息。 Firefox和Chrome工作正常。 事实证明,这是由于我在 ajax 调用中使用了本地主机引起的! 所以我的浏览器 URL 是这样的:

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

我在测试中的 Ajax 调用.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 开发工具窗口"网络"选项卡还显示 CORS 预检选项请求,后跟 XMLHttpRequest GET,这正是我期望看到的。

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

https://github.com/jpillora/xdomain

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

注意 -- 注意

不要在 ajax 中使用"http://www.domain.xxx"或"http://localhost/"或"IP>> 127.0.0.1"作为 URL。仅使用路径(目录)和页面名称而不带地址。

错误状态:

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);

相关内容

  • 没有找到相关文章

最新更新