【问题标题】:No 'Access-Control-Allow-Origin' header is present on the requested resource- AngularJS请求的资源上没有“Access-Control-Allow-Origin”标头-AngularJS
【发布时间】:2014-07-30 19:26:45
【问题描述】:
XMLHttpRequest cannot load http://mywebservice. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9000' is therefore not allowed access.

当我尝试从我的代码中运行我的网络服务时,我收到了这个错误。我试图找到它并尝试了许多我在网上找到的建议的解决方案。粘贴下面的代码。

<form name="LoginForm" ng-controller="LoginCtrl" ng-submit="init(username,password,country)">
    <label>Country</label><input type="text" ng-model="country"/><br/><br/>
    <label>UserName</label><input type="text" ng-model="username" /></br></br>
    <label>Password</label><input type="password" ng-model="password">
    </br>
    <button type="submit" >Login</button>
</form>

和controller form对应的js是:

app.controller('LoginController', ['$http', '$scope', function ($scope, $http) {
    $scope.login = function (credentials) {
    $http.get('http://mywebservice').success(function ( data ) {
        alert(data);
        });
    }
}]);

当我从 URL 栏中点击它时,网络服务工作正常。如何解决问题?请帮忙!

【问题讨论】:

  • $http.get('mywebservice').success(function ( data ) { alert(data); }); } 我认为你错过了 url 中的“'”。
  • 你没有任何解决方案可以接受吗?

标签: angularjs ajax cors cross-domain


【解决方案1】:

Chrome Webstore 有一个扩展程序,当页面中有异步调用尝试访问与您不同的主机时,该扩展程序会为您添加“Access-Control-Allow-Origin”标头。

扩展名是:“Allow-Control-Allow-Origin: *”,这是链接:https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi

【讨论】:

  • 这是迄今为止这个问题最简单的答案!谢谢
  • 这仅在您开发时有效,当您将代码发送到服务器时,代码将再次出现。除非您使用 ionic 或 phonegap 进行开发,使用 config.xml 进行检查,否则您仍然需要在 angularjs 代码上设置标题。
  • 这只是一种解决方法,而不是解决方案。它将与开发一起使用,但是一旦部署了代码,就必须修复这个问题。我们不能指望每个使用他的网站的人都有这个插件
  • 是的,但是“No Access-Control-Allow-Origin”问题应该主要发生在您从本地环境开发并且您请求网络之外的服务器时(@987654322 @)。当您将应用程序移至生产环境时,您不应该遇到此问题。如果您的应用程序从与服务器不同的域运行,则应将服务器配置为允许 CORS 请求。
  • @PatricioCórdova,我是新手,并且一直在使用 http 开发我的第一个 Angular 应用程序。目前,我的本地主机上同时运行着服务器和客户端。服务器在端口 8080 上,客户端在端口 3000 上。我得到了这里正在讨论的问题。顺便说一句,我的问题是,一旦我将客户端和服务器放入服务器,我还会遇到问题吗?我问,既然你提到了,当我们在本地环境中开发时会发生这种情况。
【解决方案2】:

在客户端,您可以通过 AngularJS 启用 cors 请求

app.config(['$httpProvider', function($httpProvider) {
        $httpProvider.defaults.useXDomain = true;
        delete $httpProvider.defaults.headers.common['X-Requested-With'];
    }
]);

但是,如果这仍然返回错误,这意味着您发出请求的服务器必须允许 CORS 请求并且必须为此进行配置。

【讨论】:

  • 嗨,我应该把这个放在哪里?
【解决方案3】:

这是一个CORS 问题。您可以在 Angular 中更改一些设置 - 这些是我通常在 Angular .config 方法中设置的设置(并非所有都与 CORS 相关):

$httpProvider.defaults.useXDomain = true;
$httpProvider.defaults.withCredentials = true;
delete $httpProvider.defaults.headers.common["X-Requested-With"];
$httpProvider.defaults.headers.common["Accept"] = "application/json";
$httpProvider.defaults.headers.common["Content-Type"] = "application/json";

您还需要配置您的网络服务 - 详细信息将取决于您使用的服务器端语言。如果您使用网络监控工具,您将看到它最初发送一个 OPTIONS 请求。您的服务器需要做出适当的响应以允许 CORS 请求。

它在你的浏览器中工作的原因是因为它没有发出跨域请求 - 而你的 Angular 代码是。

【讨论】:

  • 添加该代码后,我开始收到错误 500
【解决方案4】:

我在下面有一个解决方案,它对我有用:

app.controller('LoginController', ['$http', '$scope', function ($scope, $http) {
$scope.login = function (credentials) {
$http({
        method: 'jsonp',
        url: 'http://mywebservice',
        params: {
            format: 'jsonp',
            callback: 'JSON_CALLBACK'
        }
    }).then(function (response) {
        alert(response.data);
    });
  }
}]);

在 'http://mywebservice' 中必须有一个 callback 参数,该参数返回 JSON_CALLBACK 和数据。
下面有一个完美的示例示例

$scope.url = "https://angularjs.org/greet.php";
    $http({
        method: 'jsonp',
        url: $scope.url,
        params: {
            format: 'jsonp',
            name: 'Super Hero',
            callback: 'JSON_CALLBACK'
        }
    }).then(function (response) {
        alert(response.data);
    });

示例输出:

{"name":"Super Hero","salutation":"Apa khabar","greeting":"Apa khabar Super Hero!"}

【讨论】:

    【解决方案5】:

    我添加了这个,它对我来说很好。

    web.api

    config.EnableCors();
    

    然后你将使用 cors 调用模型:

    在控制器中,您将在顶部添加全局范围或每个类。这取决于你。

     [EnableCorsAttribute("http://localhost:51003/", "*", "*")]
    

    此外,当您将此数据推送到 Angular 时,它也希望看到 .cshtml 文件也被调用,否则它将推送数据但不会填充您的视图。

    (function () {
        "use strict";
        angular.module('common.services',
            ['ngResource'])
        .constant('appSettings',
        {
            serverPath: "http://localhost:51003/About"
        });
    }());
    
    //Replace URL with the appropriate path from production server.
    

    我希望这对任何人都有帮助,我花了一段时间才了解实体框架,以及为什么 CORS 如此有用。

    【讨论】:

    • 在哪里添加 config.EnableCors(); ?
    【解决方案6】:

    在我的例子中,我试图从使用大量 Angular 代码的 MVC 应用程序内部访问 localhost 上的 WebAPI 服务。我的 WebAPI 服务通过http://localhost/myservice 与 Fiddler 一起工作得很好。一旦我花点时间将 MVC 应用程序配置为使用 IIS 而不是 IIS Express(Visual Studio 的一部分),它就可以正常工作,而无需向任一区域添加任何与 CORS 相关的配置。

    【讨论】:

      【解决方案7】:

      我明白了

      不存在“Access-Control-Allow-Origin”标头

      问题出在我提供的 URL 上。我提供的 URL 没有路由,例如 https://misty-valley-1234.herokuapp.com/

      当我添加路径时,它起作用了,例如, https://misty-valley-1234.herokuapp.com/messages。对于 GET 请求,它可以以任何一种方式工作,但对于 POST 响应,它仅适用于添加的路径。

      【讨论】:

        【解决方案8】:

        将此扩展用于 chrome。 允许您从任何来源请求任何带有 ajax 的站点。添加到响应 'Allow-Control-Allow-Origin: *' 标头

        https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi/related

        【讨论】:

          【解决方案9】:

          get替换为jsonp

           $http.jsonp('http://mywebservice').success(function ( data ) {
              alert(data);
              });
          }
          

          【讨论】:

            【解决方案10】:

            这是服务器端的问题。您必须将客户端地址添加到服务器公开的 API。如果您使用的是 Spring 框架,您可以从 org.springframework.web.bind.annotation.CrossOrigin 注释 @CrossOrgin;

            例如:@CrossOrigin(origins = "http://localhost:8080")

            【讨论】:

              【解决方案11】:

              如果您使用的是 chrome:尝试使用 args 打开 chrome 以禁用网络安全,如下所示:

              Disable same origin policy in Chrome

              【讨论】:

              【解决方案12】:

              这就是它对我的工作方式。对于使用 Bracket 和 AngularJS 进行测试的 Windows 用户

              1) 转到您的桌面

              2) 右键单击​​桌面并在弹出的下拉对话框中查找“NEW”,它将展开

              3) 选择快捷方式

              4) 将打开一个对话框

              5) 点击浏览并寻找谷歌浏览器。

              6) 点击确定->下一步->完成,它将在您的桌面上创建谷歌快捷方式

              7) 现在右键单击您刚刚创建的 Google Chrome 图标

              8) 点击属性

              9) 在目标路径中输入这个

              "C:\Program Files\Google\Chrome\Application\chrome.exe" --args --disable-web-security
              

              10) 保存

              11) 双击您新创建的 chrome 快捷方式并在地址栏中粘贴您的链接,它将起作用。

              【讨论】:

              • @XelharK 不确定是否拖钓是什么意思?
              • 此解决方案基本上会禁用浏览器中的安全检查以用于开发目的。只要您打算在自己的计算机上使用脚本就可以了,但是 99% 的情况下,当有人在开发需要一些服务器请求的应用程序时会发生此问题,并且他可能会将该应用程序发布给公众在某一点。这个解决方案只会让它在你的机器上运行,它只是一个简单的临时绕过问题,根本不是解决方案。
              • @XelharK 那是我试图达到的目的。您应该创建 chrome 应用程序的两个副本。一个是用于浏览网页的安全应用程序,另一个是用于测试的应用程序。我希望这有助于澄清事情
              • 当然可以,但只能在您的机器上运行。如果这就是你所需要的,那么我想这可行,但问题仍然没有解决,这只是一个临时的解决方法。
              • @XelharK 是的,仅在您的本地机器上用于本地开发和测试。我意识到在部署到生产环境后,它可以与具有安全设置的普通浏览器一起使用,因为那时我正在本地网络和安全网络之外访问应用程序,并且服务器正在发回所有必需的标头信息
              猜你喜欢
              • 2017-02-07
              • 2015-06-15
              • 2023-03-16
              • 2016-01-14
              • 2023-03-15
              • 2018-12-02
              • 2015-10-30
              • 2019-10-07
              • 2021-09-28
              相关资源
              最近更新 更多