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 Google, но вернуться к моей размещенной библиотеке при сбое Google
- Вызов JSONP, показывающий «Uncaught SyntaxError: Неожиданный токен:
- jQuery размещение JSON
- jQuery DataTables - сортировать столбец точным соответствием
- Как изменить страницу в jQuery mobile (1.4 beta)?
Я помещаю несколько демонстрационных страниц с соответствующими плагинами 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
.
- jQuery получить позицию мыши внутри элемента
- jQuery, если флажок установлен
- Обратный вызов jQuery для нескольких вызовов ajax
- Почему обработчик события щелчка сразу срабатывает при загрузке страницы?
- Как исчезать для отображения: встроенный блок
- Как настроить данные для Rails с помощью JQuery
- JSON: Как сделать междоменный вызов JSON
- Преобразование объекта JS в массив с помощью jQuery
Метод POST поддерживается, и для создания междоменной https: // запрос вашей вызывающей страницы также необходимо загрузить по https. Это лучшая статья, которую я нашел, которая подробно объясняет эти и другие ограничения XDomainRequest:
Я написал прокси-сервер, который будет изящно понижать до проксирования, если используется 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