XMLHttpRequest在任何低于10的IE版本上使用AngularJS拒绝访问

时间:2013-09-09 20:09:38

标签: internet-explorer angularjs cors

在10以上版本的任何Microsoft IE浏览器上查看我的应用程序时,我在控制台上收到以下奇怪的错误:

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

我尝试在AngularJS lib之前添加以下JavaScript代码来取消控制台:

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

没有什么区别。 IE 10中的相同错误显示为:

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

可能是我试图从API中获取'/ me'以检查用户是否经过身份验证或访客。

基本上。每次服务器提供2XX或3XX以外的响应时,消除那些恼人的控制台错误都会很棒!

更新:这似乎与访问不同子域(CORS)上的API有关;

3 个答案:

答案 0 :(得分:74)

我通过Google AngularJS小组中经验丰富的ng-dev的指导实现的解决方案是xDomain library

设置非常简单,只需在您的API的根目录下放置一个proxy.html文件,其中包含一个允许来源的正则表达式/字符串(' master'),以及对脚本的引用前端,然后从您的前端脚本(' master')指向此文件。

它的工作原理是在iframe中打开proxy.html文件,并使用postMessage与CORS资源进行通信。

像$ http和$ resource一样使用魅力。

通过将脚本置于所有JavaScript库包括:

之上,您还可以维护普通浏览器的正常运行
<!--[if lte IE 9]>
<script src="xdomain.js" slave="http://example.org/proxy.html"></script>
<![endif]-->

答案 1 :(得分:4)

当然你的问题与CORS有关。 IE10使用真正的XmlHttpRequest,但在此之前,IE没有。到目前为止,我发现解决这些类型问题的最简单方法是使用apache或nginx来代理API。 例如,使用nginx,在您的服务器{}块中:

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

请注意,即使jQuery不支持XDomainRequest和CORS,您也必须添加一个插件才能获得XDR。另请注意,XDR在CORS方面存在一些严重的限制。

答案 2 :(得分:-1)

在我的情况下,Response Headers包含

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

这是IE9的一个问题,因为它无法在响应中正确处理/解析JSON对象。

Response Headers切换为

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

此外,请确保IE9包含以下模块:https://stackoverflow.com/a/28905072/1202371

允许在文本中接收响应,然后将其转换为JSON对象。