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, но он имеет точно такую ​​же проблему.

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

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

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

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

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

Решение состоит из двух частей. Первый – скрипт jquery, который перехватывает обработку 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 заголовка X-CorsProxy-Url и выполнить HTTP-запрос и, наконец, вернуть результат.

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

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

  • Как получить элемент nth jQuery
  • Открытие вкладки с привязкой
  • VueJs templating. Как загрузить внешние шаблоны
  • Mailchimp подписывается с помощью jQuery AJAX?
  • Как добавить функцию в jQuery?
  • json Uncaught SyntaxError: Неожиданный токен:
  • AngularJS: $ viewContentLoaded, выпущенный до частичного просмотра
  • jQuery получить значение select onChange
  • В чем разница между jQuery's replaceWith () и html ()?
  • jQuery откладывает и обещает - .then () vs .done ()
  • jQuery - включение / выключение флажка
  • Давайте будем гением компьютера.