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, который не возвращает никаких данных?

822   12  

12 ответов:

Это известная ошибка С помощью jQuery. Команда jQuery не планирует поддерживать это в core и лучше подходит в качестве плагина.(См.комментарий). Т. е. не не использовать XMLHttpRequest, но альтернативный объект с именем XDomainRequest.

здесь и плагин для поддержки этого в jQuery, который можно посмотреть здесь: https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js

EDIT Функция $.ajaxTransport регистрирует фабрику транспортера. Транспортер используется внутри by $.ajax для выполнения запросов. Поэтому Я предположим вы должны быть в состоянии назвать $.ajax как обычно. Информация о перевозчиках и расширении $.ajax можно найти здесь.

кроме того, возможно, лучшая версия этого плагина может быть найденным здесь.

две другие Примечания:

  1. объект XDomainRequest был введено из IE8 и не будет работать в версиях ниже.
  2. от IE10 CORS будет поддерживается с помощью обычного XMLHttpRequest.

Edit 2: http to https problem

запросы должны быть нацелены на ту же схему, что и страница хостинга

этот ограничение означает, что если ваша страница AJAX находится на http://example.com, то ваш целевой URL также должен начинаться с HTTP. Аналогично, если ваша страница AJAX находится вhttps://example.com, то ваш целевой URL также должен начинаться с HTTPS.

источник: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

отталкиваясь от принятого ответа @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/plain conten-тип, как описано здесь: 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 и более новых версиях

очень полезная ссылка:

http://graphicmaniacs.com/note/getting-a-cross-domain-json-with-jquery-in-internet-explorer-8-and-later/

может помочь с проблемой возврата 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 с ограниченным дополнительным кодированием.

https://github.com/jpillora/xdomain

попробуйте использовать 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

    Ничего не найдено.