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
,
3 ответа
Поддерживается метод 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
Заголовок http и сделать 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