所请求的资源上没有“ Access-Control-Allow-Origin”标头-AngularJS


69
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.

当我尝试从代码内部运行Web服务时,出现此错误。我尝试找到有关它,并尝试了许多在网上找到的建议解决方案。粘贴下面的代码。

<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>

与控制器对应的js形式为:

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

当我从URL栏中单击该Web服务时,它工作正常。如何解决问题?请帮助!


$ http.get(' mywebservice')。success(function(data){alert(data);}); 我认为您在网址中错过了“'”。
Shivkumar 2014年

您没有任何解决方案可以接受吗?
Sampath

Answers:


26

Chrome网上应用店有一个扩展,增加了“访问控制允许来源”为你头时,有在页面异步调用试图访问一个不同的主机比你。

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


这是迄今为止这个问题最简单的答案!谢谢
Yar 2015年

这仅在开发时有效,当您将代码发送到服务器时,代码将再次出现。除非您使用ionic或phonegap进行开发,否则将使用config.xml进行此检查,否则您仍然需要在angularjs代码上设置标头。
Magus

9
这只是一种解决方法,而不是解决方案。它可以与开发一起使用,但是一旦部署了代码,就必须解决此问题。我们不能期望每个使用他的网站的人都拥有这个插件
Vatsal

3
的确如此,但是“无访问权限允许来源”问题应该主要在您从本地环境进行开发时,并且您正在请求网络外部的服务器时发生(developer.mozilla.org/en-US/ docs / Web / HTTP / Access_control_CORS)。当您将应用程序移至生产环境时,您应该不会遇到这个问题。如果您的应用程序从与服务器不同的域中运行,则应将服务器配置为允许CORS请求。
PatricioCórdova'16

@PatricioCórdova,我是新手,并且一直在使用http开发我的第一个角度应用程序。目前,我的本地主机上同时运行服务器和客户端。服务器位于端口8080上,客户端位于端口3000上。我遇到了正在此处讨论的问题。顺便说一句,我的问题是,一旦将客户端和服务器放入服务器中,我是否还会遇到问题?我问自从您提到以来,这是在我们在当地环境中发展时发生的。
vigamage,2013年

18

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

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

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


嗨,我应该放在哪里?
vigamage '16

15

这是一个CORS问题。您可以更改一些角度设置-这些是我通常在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";

您还需要配置Web服务-具体细节将取决于您所使用的服务器端语言。如果您使用网络监视工具,则将看到它最初发送一个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 ”中,必须有一个回调参数,该参数返回带有数据的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!"}

2

我添加了它,对我来说效果很好。

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如此有用。


1
在哪里添加config.EnableCors(); ?
Elvin Mammadov

1

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


0

我有

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

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

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




0

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

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



-10

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

1)转到桌面

2)右键点击您的桌面,然后在弹出的下拉对话框中查找“ NEW”,它将展开

3)选择快捷方式

4)将打开一个对话框

5)单击浏览,然后找到Google Chrome。

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

7)现在,右键单击刚创建的Google Chrome浏览器图标

8)点击属性

9)在目标路径中输入

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

10)保存

11)双击您新创建的Chrome快捷方式,然后在地址栏中跳过您的链接即可使用。


@XelharK不确定是否拖钓是什么意思?
塞缪尔·夸梅·安特维

4
此解决方案基本上会出于开发目的而禁用浏览器中的安全检查。只要您打算在自己的计算机上使用该脚本就可以了,但是在99%的时间中,当有人在开发需要某个服务器请求的应用程序时,就会发生此问题,并且他可能会将该应用程序公开发布在某一点。该解决方案将使其在您的机器上运行,只是暂时解决问题,根本不是解决方案。
XelharK 2015年

@XelharK这就是我想要达到的目的。您应该创建chrome应用程序的两个副本。一个是用于浏览网络的安全应用,另一个是用于测试的安全应用。我希望帮助clearify东西
塞缪尔·夸安特维

1
当然,这可以使它正常工作,但只能在您的计算机上使用。如果这就是您所需要的,那么我想这可行,但是问题仍然没有解决,这只是解决问题的一种临时方法。
XelharK 2015年

@XelharK是,仅在本地计算机上用于本地开发和测试。我意识到在部署到生产环境后,它可以与具有安全设置的普通浏览器一起使用,因为那时候我正在从本地网络和安全网络外部访问应用程序,并且服务器正在发回所有必需的标头信息
Samuel Kwame Antwi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.