Подтвердить что ты не робот

CORS с jQuery и XDomainRequest в IE8/9

ОБНОВЛЕНИЕ: Я настоятельно рекомендую не вкладывать деньги в XDomainRequest, потому что это очень плохая реализация со многими ограничениями. Он в основном работает только для запросов GET для серверов, отличных от ssl, поэтому вы также можете использовать jsonp или что-то еще.


Я использую CORS для вызова API перекрестного домена, однако Internet Explorer дает проблемы. CORS должен быть возможен в IE8 и IE9 через объект XDomainRequest, однако я не могу заставить работу работать.

JQuery отказывается, чтобы предоставить встроенную поддержку XDomainRequest, однако нескольким плагинам jQuery предлагается добавить эту поддержку. Эта тема предлагает два таких плагина: jQuery.XDomainRequest.js и xdr.js, о котором сообщалось. Afaik, плагины должны автоматически переопределять поведение jQuery.ajax. Я нашел еще один плагин здесь.

Я разместил небольшие демо-страницы с соответствующими плагинами jQuery.XDomainRequest и xdr и jquery.ie.cors, которые выполняют запросы ajax на сервере с поддержкой CORS. Страницы работают в Chrome и Firefox, однако IE8/9 мгновенно бросает отклоненную разрешенную ошибку (даже до подачи запроса). Этот сообщение MSDN предлагает добавить другого обработчика xhr.onprogress = function() {};, но я пробовал это, и он тоже не работает.

Любые подсказки, что я делаю неправильно? Я также тестировал с IE8 теперь с использованием виртуального сервера MS, но он имеет точно такую ​​же проблему.

Изменить: ОК, поэтому я понял, что часть проблемы заключалась в том, что я использовал POST поверх HTTPS. По-видимому, XDomainRequest не разрешает CORS через HTTPS. Я могу переключиться на HTTP, но мне действительно нужен POST.

Edit2: см. эту проблему в github для завершения этой истории. Оказывается, при использовании HTTP POST xDomainRequest может кодировать тело запроса (аргументы) только как text/plain. Это в значительной степени делает его бесполезным, потому что каждый использует application/x-www-form-urlencoded или multipart/form-data.

4b9b3361

Ответ 1

Поддерживается метод POST, и для создания междоменной https://запрос вашей вызывающей страницы также необходимо загрузить через https. Это лучшая статья, которую я нашел, которая подробно объясняет эти и другие ограничения XDomainRequest:

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

Ответ 2

Я написал прокси-сервер, который будет изящно понижать до проксирования, если используется IE9 или меньше. Вам не нужно менять свой код вообще, если вы используете ASP.NET.

Решение состоит из двух частей. Первый - это jquery script, который перехватывает обработку jQuery ajax. Он будет автоматически вызывать веб-сервер, если будет выполнен запрос crossDomain, а браузер - 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;
    }
});

На вашем веб-сервере вы должны получить запрос, получить значение из заголовка X-CorsProxy-Url http и выполнить HTTP-запрос и, наконец, вернуть результат.

Мое сообщение в блоге: http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/

Ответ 3

Для запросов CORS в IE8/9 вы можете использовать плагин jQuery jquery-transport-xdr