Подтвердить что ты не робот

Доступ к XMLHttpRequest запрещен с помощью AngularJS для любой версии IE ниже 10

При просмотре моего приложения в любом браузере Microsoft IE версии более 10, я получаю следующую странную ошибку на консоли:

console screen shot from the developer console, the view doesn't get resolved due to this error

Я попытался отменить консоль с добавлением следующего кода JavaScript до версии AngularJS lib:

console.log = function(){};
window.console = {log: function(){}};

Это не имело значения. Такая же ошибка в IE 10 выглядит как:

SCRIPT7002: XMLHttpRequest: Network Error 0x80070005, Access is denied.

Возможно, я пытаюсь получить "/me" из API, чтобы проверить, аутентифицирован ли пользователь или гость.

В принципе. устраняя эти раздражающие ошибки консоли каждый раз, когда сервер дает ответ, отличный от 2XX или 3XX, будет замечательным!

UPDATE: похоже, это связано с доступом к API через другой поддомен (CORS);

4b9b3361

Ответ 1

Решение, которое мне удалось достичь с помощью опытного ng-dev в группе Google AngularJS, это xDomain library.

Настройка очень проста, просто поместите файл proxy.html в корень вашего API, с регулярным выражением/строкой для разрешенного источника ( "мастер" ) и ссылкой на script во внешнем интерфейсе, а затем укажите этот файл из внешнего интерфейса script ('master').

Он работает, открывая файл proxy.html в iframe и взаимодействуя с ресурсом CORS с помощью postMessage.

Работает как шарм с $http и $resource.

Вы также можете поддерживать нормальное функционирование для обычных браузеров, разместив script, прежде всего, в библиотеке JavaScript:

<!--[if lte IE 9]>
<script src="xdomain.js" slave="http://example.org/proxy.html"></script>
<![endif]-->

Ответ 2

Конечно, ваша проблема связана с CORS. IE10 использует настоящий XmlHttpRequest, но до этого IE этого не делал. Безусловно, самый простой способ решить эти проблемы - использовать apache или nginx для прокси API. Например, с nginx, на вашем сервере {} block:

location /api {
   proxy_pass http://my.server.name:12345/v1;
   proxy_redirect off;
}

Обратите внимание, что даже jQuery не поддерживает XDomainRequest и CORS прямо, вам нужно добавить плагин для получения XDR. Также обратите внимание: XDR имеет некоторые серьезные ограничения в отношении CORS.

Ответ 3

В моем случае Response Headers содержал

Content-Type:application/json; charset=UTF-8

и это проблема для IE9, поскольку он не может правильно обрабатывать/анализировать объекты JSON в ответах.

Переключение Response Headers в

Content-Type:text/plain; charset=UTF-8

Кроме того, убедитесь, что для IE9 включен следующий модуль: fooobar.com/info/55028/...

разрешено получать ответ в тексте, а затем преобразовывать его в объект JSON.