IE9 jQuery AJAX с CORS возвращает " Доступ запрещен"
следующие работы во всех браузерах кроме IE (Я тестирую в IE 9).
jQuery.support.cors = true;
...
$.ajax(
url + "messages/postMessageReadByPersonEmail",
{
crossDomain: true,
data: {
messageId : messageId,
personEmail : personEmail
},
success: function() {
alert('marked as read');
},
error: function(a,b,c) {
alert('failed');
},
type: 'post'
}
);
у меня есть еще одна функция, которая использует dataType: 'jsonp', но мне не нужны никакие данные, возвращаемые при этом вызове AJAX. Моим последним средством будет вернуть некоторые jibberish, завернутые в JSONP, чтобы заставить его работать.
любые идеи, почему IE завинчивается с запросом CORS, который не возвращает никаких данных?
12 ответов:
Это известная ошибка С помощью jQuery. Команда jQuery не планирует поддерживать это в core и лучше подходит в качестве плагина.(См.комментарий). Т. е. не не использовать XMLHttpRequest, но альтернативный объект с именем XDomainRequest.
здесь и плагин для поддержки этого в jQuery, который можно посмотреть здесь: https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js
EDIT Функция
$.ajaxTransportрегистрирует фабрику транспортера. Транспортер используется внутри by$.ajaxдля выполнения запросов. Поэтому Я предположим вы должны быть в состоянии назвать$.ajaxкак обычно. Информация о перевозчиках и расширении$.ajaxможно найти здесь.кроме того, возможно, лучшая версия этого плагина может быть найденным здесь.
две другие Примечания:
- объект XDomainRequest был введено из IE8 и не будет работать в версиях ниже.
- от IE10 CORS будет поддерживается с помощью обычного XMLHttpRequest.
Edit 2: http to https problem
запросы должны быть нацелены на ту же схему, что и страница хостинга
этот ограничение означает, что если ваша страница AJAX находится на http://example.com, то ваш целевой URL также должен начинаться с HTTP. Аналогично, если ваша страница AJAX находится вhttps://example.com, то ваш целевой URL также должен начинаться с HTTPS.
отталкиваясь от принятого ответа @dennisg, я успешно выполнил это с помощью jQuery.XDomainRequest.js на MoonScript.
следующий код работал правильно в Chrome, Firefox и IE10, но не удалось в IE9. Я просто включил скрипт и теперь он автоматически работает в IE9. (И, вероятно, 8, но я не проверял его.)
var displayTweets = function () { $.ajax({ cache: false, type: 'GET', crossDomain: true, url: Site.config().apiRoot + '/Api/GetTwitterFeed', contentType: 'application/json; charset=utf-8', dataType: 'json', success: function (data) { for (var tweet in data) { displayTweet(data[tweet]); } } }); };
полные инструкции о том, как это сделать с помощью плагина" jQuery-ajaxTransport-XDomainRequest " можно найти здесь: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions
этот плагин активно поддерживается и обрабатывает HTML, JSON и XML. Файл также размещен на CDNJS, так что вы можете напрямую удалить скрипт на свою страницу без каких-либо дополнительных установка: http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest.min.js
проблема в том, что IE9 и ниже не поддерживают CORS. XDomainRequest поддерживает только GET / POST и
text/plainconten-тип, как описано здесь: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspxпоэтому, если вы хотите использовать все HTTP-команды и/или json и т. д., Вам нужно использовать другое решение. Я написал прокси, который будет изящно понижен до проксирования, если используется 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; } });на вашем веб-сервере вы должны получить запрос, получить значение из HTTP-заголовка X-CorsProxy-Url и выполнить HTTP-запрос и, наконец, вернуть результат.
мой блог : http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/
Я только что сделал все запросы JSONP потому что это было единственное решение для всех наших поддерживаемых браузеров (IE7+ и завсегдатаев). Имейте в виду, ваш ответ технически работает для IE9, поэтому у вас есть правильный ответ.
получение междоменного JSON с jQuery в Internet Explorer 8 и более новых версиях
очень полезная ссылка:
может помочь с проблемой возврата json из запроса домена X.
надеюсь, это кому-то поможет.
основываясь на решении MoonScript, вы можете попробовать это вместо этого:
https://github.com/intuit/xhr-xdr-adapter/blob/master/src/xhr-xdr-adapter.js
преимущество заключается в том, что, поскольку это решение более низкого уровня, оно позволит CORS (насколько это возможно) на IE 8/9 с другими фреймворками, а не только с jQuery. Я имел успех, используя его с AngularJS, а также jQuery 1.x и 2.x.
чтобы решить эту проблему, также проверьте, если у вас есть в комплекте .js в ваш ajax-файл называется: Я получил ошибку отказа в доступе, включая shadowbox.js в моем ajax.php
Я тестировал веб-службу CORS на своей машине dev и получал сообщение об ошибке "Доступ запрещен" только в IE. Firefox и Chrome работали нормально. Оказывается, это было вызвано моим использованием localhost в вызове ajax! Так что мой URL браузера было что-то вроде:
http://my_computer.my_domain.local/CORS_Service/test.html
и мой вызов ajax внутри теста.html было что-то вроде:
//fails in IE $.ajax({ url: "http://localhost/CORS_Service/api/Controller", ... });все работало, как только я изменил ajax вызов для использования моего компьютера IP вместо localhost.
//Works in IE $.ajax({ url: "http://192.168.0.1/CORS_Service/api/Controller", ... });вкладка "сеть" окна инструментов IE dev также показывает запрос параметров предварительного полета CORS, за которым следует XMLHttpRequest GET, что именно то, что я ожидал увидеть.
обновление по состоянию на начало 2015 года. xDomain-это широко используемая библиотека для поддержки CORS на IE9 с ограниченным дополнительным кодированием.
попробуйте использовать jquery-transport-xdr плагин jQuery для запросов CORS в IE8 / 9.
Примечание-Примечание
Не используйте "http://www.домен.xxx" или "http://localhost/ " или "IP > > 127.0.0.1" для URL в ajax. используйте только путь (каталог) и имя страницы без адреса.
ложное состояние:
var AJAXobj = createAjax(); AJAXobj.onreadystatechange = handlesAJAXcheck; AJAXobj.open('POST', 'http://www.example.com/dir/getSecurityCode.php', true); AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); AJAXobj.send(pack);истинное положение:
var AJAXobj = createAjax(); AJAXobj.onreadystatechange = handlesAJAXcheck; AJAXobj.open('POST', 'dir/getSecurityCode.php', true); // <<--- note AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); AJAXobj.send(pack);
Comments