【问题标题】:Access Denied with $http request in Angular and IE8在 Angular 和 IE8 中使用 $http 请求拒绝访问
【发布时间】:2013-04-11 23:08:15
【问题描述】:

我正在尝试让我的 Angular 应用程序执行 $http.get 请求。适用于除 IE8 之外的任何地方。我正在使用最新的 Angular(我认为是 1.0.6)。 IE 给出的唯一消息是:TypeError:

访问被拒绝。 未定义(在以前的角度是)

我的主机 (nodejs) 设置为发送 cors 标头:

res.header('Access-Control-Allow-Origin', '*'); //config.allowedDomains
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, X-Requested-By');
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');

我尝试使用调试工具获取有关错误的更多信息,但是:

Fiddler:不显示 xmlhttprequests - 似乎您可以破解您的 NET 应用程序来解决此问题,但不确定如何处理我的网页。 DebugBar:也不显示这些请求 FirebugLite:我尝试的 2 个版本已损坏 - 只是随机错误并且无法加载

将主机更改为相同的来源可以解决问题,所以我认为它正在尝试一些东西,但是很难调试。

关于这方面的 Angular 帖子似乎已经过时了,我不知道从这里开始做什么。

【问题讨论】:

  • Fiddler 确实为 IE 显示了 XHR。如果没有,那将是一个巨大的疏忽。 stackoverflow.com/questions/7351238/…
  • 也准确地说,IE8和IE9没有XHR,而是做XDomainRequest,或者XDR。
  • 好吧,我已经阅读了那个提琴手的帖子并检查了设置,在我的一生中,我看不到任何这些请求。其他帖子表明必须为提琴手设置代理才能获取这些。而且我知道 IE8 XHR - XDomainRequest - 我似乎无法为当前的 Angular 文档提供资金。一些较早的帖子表明不支持 XDomainRequests,但不确定当前状态是什么 - 我很难相信 IE8 不能与 Angular $http 一起使用
  • 很可能是我的设置导致 Fiddler 无法工作 - vmware 客户端到 OSX Nodejs 服务器。然而,主要问题只是让 IE8 工作
  • 我的系统就是这样设置的(当然我不测试 IE8)。我知道 $http 应该适用于 IE8,所以可能还有其他问题。

标签: javascript node.js internet-explorer-8 angularjs


【解决方案1】:

这与 $http 无关。 $http 允许您发出 XHR(XDR) 或 JSONP 请求。它没有提供规避浏览器同源策略的机制。

将主机更改为相同的来源可以解决问题,所以我认为它正在尝试一些东西,但是很难调试。

这是解决问题的关键。 IE8 不能很好地支持跨域资源共享 (CORS)。为了使用 IE8 进行跨域调用,你最好:

  1. 使用您的 nodejs 应用为您代理请求,让您使用相同的域。
  2. 在 $http.get() 请求中使用 JSONP

有许多与 CORS 和 IE8 相关的陷阱,它们是 outlined here

【讨论】:

  • 似乎我可以使用 XDomainRequest - 有人制作了一个支持此功能的 Angular 分支,但它现在已经过时了。
  • 我建议不要使用 XDomainRequest。 Angular 的人有充分的理由不合并这个特性,这不是一个很好的解决方案。如果可能的话,我会使用 nodejs 或通过在节点应用程序前面添加带有 mod_proxy 的 apache 来代理请求。
  • OlliM 是对的,XDR 很烂。默认情况下,expressjs 的表单解析器无法解析发布的数据,因为 XDR 仅支持 text/plain 内容类型。没有自定义标头支持,没有预检请求等。
  • Angular 1.2 不支持 IE
【解决方案2】:

我遇到了同样的问题,虽然它可能并不理想,但一种解决方案是将 IE 的“跨域访问数据源”安全设置更改为启用提示

http://technet.microsoft.com/en-us/library/dd346862.aspx

在我的情况下,当我尝试从托管在另一个域上的我自己的 API 中获取数据(通过 angular 的 $resource)时,我遇到了同样的事情。在 IE8 和 IE9 中,这些请求将失败,并出现上述错误。更改 IE 中的安全设置以允许跨域数据请求解决了该问题。

【讨论】:

    【解决方案3】:

    AngularJS 不支持 IE

    根据需要,有github官方AngualrJS网站的链接:

    AngularJS Github official discussion

    【讨论】:

    • 为什么-1请说出来?
    • 请提供支持您声明的链接。然后我将删除我的 -1
    • @schmidlop 完成。谢谢解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2015-05-27
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多