IE9 jQuery AJAX with CORS returns " access is denied"

Poniższe działa we wszystkich przeglądarkach z wyjątkiem IE (testuję w 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'
            }
        );

Mam inną funkcję, która używa dataType: 'jsonp', ale nie potrzebuję żadnych danych zwracanych podczas tego wywołania AJAX. Moją ostatnią deską ratunku będzie zwrócenie trochę jibberish zapakowanego w JSONP tylko po to, żeby to zadziałało.

Jakieś pomysły, dlaczego IE spieprza z żądaniem CORS, które nie zwraca żadnych danych?

Author: ronnyfm, 2012-04-19

12 answers

Jest to znany błąd z jQuery. Zespół jQuery " nie planuje wspierać tego w core i lepiej nadaje się jako wtyczka."(Zobacz Ten komentarz ). IE nie używa XMLHttpRequest , ale alternatywnego obiektu o nazwie XDomainRequest .

Tam jest plugin dostępny do obsługi tego w jQuery, który można znaleźć tutaj : https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js

EDIT Funkcja $.ajaxTransport rejestruje fabrykę transportera. Transporter jest używany wewnętrznie przez $.ajax do wykonywania żądań. Dlatego, ja zakładam powinieneś być w stanie zadzwonić $.ajax Jak zwykle. Informacje na temat transporterów i rozszerzeń $.ajax można znaleźć tutaj .

Również, być może lepszą wersję tej wtyczki można znaleźć tutaj .

Dwa inne uwagi:

  1. obiekt XDomainRequest został wprowadzony z IE8 i nie będzie działał w wersjach poniżej.
  2. Z IE10 CORS będzie obsługiwany przy użyciu zwykłego XMLHttpRequest .

Edit 2: http to https problem

Żądania muszą być kierowane do tego samego schematu co strona hostingowa

To ograniczenie oznacza, że jeśli Twoja strona AJAX jest na http://example.com , wtedy twój docelowy adres URL również musi się zaczynać z HTTP. Podobnie, jeśli Twoja strona AJAX jest w https://example.com , wtedy twój docelowy adres URL musi również zaczynać się od HTTPS.

Źródło: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

 149
Author: dennisg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-11 16:37:14

Opierając się na zaakceptowanej odpowiedzi przez @ dennisg, udało mi się to z powodzeniem używając jQuery.XDomainRequest.js {[3] } by MoonScript.

Poniższy kod działał poprawnie w Chrome, Firefox i IE10, ale nie powiódł się w IE9. Po prostu włączyłem skrypt i teraz działa automagicznie w IE9. (I pewnie 8, ale nie testowałem tego.)

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]);
            }
        }
    });
};
 62
Author: JackMorrissey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-17 18:16:38

Pełna instrukcja jak to zrobić za pomocą wtyczki "jQuery-ajaxTransport - XDomainRequest" znajduje się tutaj: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions

Ta wtyczka jest aktywnie obsługiwana i obsługuje HTML, JSON i XML. Plik jest również hostowany na CDNJS, więc możesz bezpośrednio upuścić skrypt na swoją stronę bez dodatkowych konfiguracja: http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest.min.js

 16
Author: MoonScript,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-05 19:15:03

Problem polega na tym, że IE9 i niżej nie obsługują CORS. XDomainRequest obsługuje tylko GET / POST i typ text/plain conten, jak opisano tutaj: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

Więc jeśli chcesz używać wszystkich czasowników HTTP i / lub json itp musisz użyć innego rozwiązania. Napisałem proxy, który będzie wdzięcznie downgrade do proxy, jeśli IE9 lub less jest używany. Nie musisz zmieniać kodu na wszystko, jeśli używasz ASP.NET.

Rozwiązanie składa się z dwóch części. Pierwszym z nich jest skrypt jquery, który łączy się z przetwarzaniem jQuery ajax. To automatycznie wywoła serwer WWW, jeśli żądanie crossDomain jest wykonane, a przeglądarka jest 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;
    }
});

Na twoim serwerze WWW musisz otrzymać żądanie, pobrać wartość z nagłówka http X-CorsProxy-Url i wykonać żądanie HTTP i ostatecznie zwrócić wynik.

Mój wpis na blogu: http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/

 3
Author: jgauffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-24 11:07:23

Po prostu złożyłem wszystkie prośby JSONP , ponieważ było to jedyne rozwiązanie dla wszystkich obsługiwanych przez nas przeglądarek (IE7+ i bywalców). Pamiętaj, że Twoja odpowiedź działa technicznie dla IE9, więc masz poprawną odpowiedź.

 1
Author: Garrett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-20 17:57:17

Uzyskiwanie JSON z jQuery w przeglądarce Internet Explorer 8 i nowszych wersjach

Bardzo przydatny link:

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

Może pomóc w problemie ze zwrotem json z żądania domeny X.

Mam nadzieję, że to komuś pomoże.

 1
Author: jmarcosSF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-30 20:11:59

Bazując na rozwiązaniu MoonScript, możesz zamiast tego spróbować:

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

Zaletą jest to, że ponieważ jest to rozwiązanie niższego poziomu, umożliwi CORS (w miarę możliwości) na IE 8/9 z innymi frameworkami, a nie tylko z jQuery. Odniosłem sukces używając go z AngularJS, a także jQuery 1.x i 2.x.

 1
Author: yanni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-15 22:54:13

Aby rozwiązać ten problem, sprawdź również, czy masz jakieś włączone .js do pliku ajax o nazwie: Otrzymałem błąd Odmowa dostępu podczas włączania shadowbox.js w moim Ajaxie.php

 0
Author: hacklover,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-08 08:04:25

Testowałem usługę sieciową CORS na mojej maszynie dev i otrzymywałem komunikat o błędzie "Access is denied" tylko w IE. Firefox i Chrome działały dobrze. Okazuje się, że było to spowodowane przez moje użycie localhost w wywołaniu ajax! Więc mój URL przeglądarki był coś w stylu:

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

I mój telefon ajax w teście.html był coś w stylu:

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

Wszystko działało, gdy zmieniłem połączenie ajax, aby korzystać z komputera IP zamiast localhost.

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

W oknie IE dev tools zakładka "sieć" pokazuje również żądanie opcji inspekcji wstępnej CORS, a następnie GET XMLHttpRequest, który jest dokładnie tym, czego oczekiwałem.

 0
Author: jwill212,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-07 13:37:15

Aktualizacja na początku 2015 roku. xDomain jest powszechnie używaną biblioteką obsługującą CORS na IE9 z ograniczonym dodatkowym kodowaniem.

Https://github.com/jpillora/xdomain

 0
Author: Alkaline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-13 04:42:48

Spróbuj użyć jQuery-transport-xdr jQuery plugin dla żądań CORS w IE8/9.

 0
Author: Gordon Freeman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-06 17:21:03

Uwaga -- Uwaga

Nie używaj " http://www.domena.xxx " lub " http://localhost/ " lub "IP > > 127.0.0.1" dla adresu URL w Ajaxie. używaj tylko ścieżki (katalogu) i nazwy strony bez adresu.

False state:

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

True state:

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);
 -1
Author: ali bagheri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-28 21:03:49