Доступ к 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);
Ответы
Ответ 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.