CORS z jQuery i XDomainRequest w IE8 / 9

UPDATE: Gorąco polecam nie inwestować ani chwili w XDomainRequest, ponieważ jest to strasznie słaba implementacja z wieloma ograniczeniami. Zasadniczo działa tylko dla żądań GET do serwerów innych niż ssl, więc równie dobrze możesz użyć jsonp lub czegokolwiek innego.


Używam CORS do wywoływania cross domain API, jednak Internet Explorer daje problemy. CORS powinien być możliwy w IE8 i IE9 przez obiekt XDomainRequest, jednak nie mogę uruchomić rzeczy..

JQuery odmawia zapewnienia natywnego wsparcia dla XDomainRequest, jednak kilka wtyczek jQuery jest sugerowanych, aby dodać to wsparcie. Ten temat proponuje dwie takie wtyczki: jQuery.XDomainRequest.js i xdr.js , który został zgłoszony do pracy. Afaik, wtyczki powinny automatycznie nadpisać zachowanie jQuery.ajax. Znalazłem inny plugin tutaj .

Umieściłem Małe strony demo z odpowiednimi wtyczkami jQuery.XDomainRequest i W przeciwieństwie do jQuery, jQuery i jQuery mogą być używane w wielu aplikacjach, takich jak np. Strony działają w Chrome i Firefox, jednak IE8 / 9 natychmiast wyrzuca błąd Odmowa uprawnień (nawet przed złożeniem żądania). Ten MSDN post sugeruje dodanie innego Handlera xhr.onprogress = function() {}; ale próbowałem tego i też nie działa.

Jakieś wskazówki, co robię źle? Testowałem również z IE8 teraz używając MS virtual server, ale ma dokładnie to samo problem.

Edit: OK więc zorientowałem się, że część problemu było to, że używałem POST przez HTTPS. Najwyraźniej XDomainRequest nie pozwala CORS przez HTTPS. Mogę przełączyć się na HTTP, ale naprawdę potrzebuję posta.

Edit2: Zobacz ten problem na GitHubie na koniec tej historii. Okazuje się, że podczas używania HTTP POST, xDomainRequest może zakodować treść żądania (argumenty) tylko jako text/plain. To czyni go bezwartościowym, ponieważ każdy używa application/x-www-form-urlencoded lub multipart/form-data.
Author: Community, 2012-07-15

3 answers

Metoda POST jest obsługiwana, a aby zażądać HTTPS:// dla wielu domen, Twoja strona wywołująca musi być również załadowana przez https. Jest to najlepszy artykuł, jaki znalazłem, który szczegółowo wyjaśnia te i inne ograniczenia XDomainRequest:

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

 28
Author: Adam Alexander,
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-08-24 11:24:25

Napisałem proxy, który będzie wdzięcznie downgrade do proxy jeśli IE9 lub less jest używany. Nie musisz w ogóle zmieniać kodu, 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. Automatycznie wywoła serwer WWW, jeśli zostanie złożone żądanie crossDomain, a przeglądarka to 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 X-CorsProxy-Url http i wykonaj żądanie HTTP i na koniec zwróć wynik.

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

 5
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:04:56

Dla CORS żądań w IE8 / 9 możesz użyć wtyczki jQuery jquery-transport-xdr

 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 20:18:49