在请求的资源AngularJS上没有“Access-Control-Allow-Origin”标题
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服务时,出现此错误。 我试图find它,并尝试了许多解决scheme,这是我在网上find的build议。 粘贴下面的代码。
<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栏中findnetworking服务时,networking服务工作正常。 如何解决这个问题? 请帮助!
Chrome网上应用店有一个扩展function,当您尝试访问不同于您的主机的网页中存在asynchronous呼叫时,会为您添加“Access-Control-Allow-Origin”标头。
扩展名是:“ Allow-Control-Allow-Origin:* ”,这是链接: https : //chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi
在客户端,您可以通过AngularJS启用Cors请求
app.config(['$httpProvider', function($httpProvider) { $httpProvider.defaults.useXDomain = true; delete $httpProvider.defaults.headers.common['X-Requested-With']; } ]);
但是,如果这仍然返回一个错误,这将意味着您正在发出请求的服务器必须允许CORS请求,并且必须为此进行configuration。
这是一个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";
您还需要configuration您的Web服务 – 这些的细节将取决于您使用的服务器端语言。 如果您使用networking监控工具,您将看到它最初发送OPTIONS请求。 您的服务器需要做出适当的响应以允许CORS请求。
它在你的浏览器工作的原因是因为它不是一个交叉来源的请求 – 而你的Angular代码是。
我有一个解决scheme,下面是我的作品:
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!"}
我加了这个,对我来说工作得很好。
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.
我希望这可以帮助任何人,我花了一段时间了解entity framework,以及为什么CORS是如此有用。
在我的情况下,我试图从使用了很多Angular代码的MVC应用程序中在本地主机上打一个WebAPI服务。 我的WebAPI服务可以通过http:// localhost / myservice和Fiddler一起工作。 一旦我花了一些时间来configurationMVC应用程序使用IIS而不是IIS Express(Visual Studio的一部分),它运行良好,没有添加任何区域的CORS相关的configuration。
看看这个讨论
Access-Control-Allow-Origin和Angular.js $ http
http://forum.rejectedsoftware.com/groups/rejectedsoftware.vibed/thread/10500/
我有
没有“Access-Control-Allow-Origin”标题存在
问题出在我提供的URL上。 我提供了没有路由的url,例如https://misty-valley-1234.herokuapp.com/
。
当我添加了一个工作的path,例如, https://misty-valley-1234.herokuapp.com/messages
: https://misty-valley-1234.herokuapp.com/messages
。 有了GET请求,它可以工作,但是POST响应只能用于添加的path。
使用此扩展名为铬。 允许你从任何来源请求任何网站的Ajax。 添加到响应“允许控制允许来源:*”标题
用jsonp
replaceget
:
$http.jsonp('http://mywebservice').success(function ( data ) { alert(data); }); }
这是服务器端的问题。 您必须将您的客户端地址添加到服务器公开的API。 如果您使用的是Spring框架,可以从org.springframework.web.bind.annotation.CrossOrigin注释@CrossOrgin;
例如:@CrossOrigin(origins =“ http:// localhost:8080 ”)
如果您正在使用chrome:请尝试使用args打开chrome以禁用networking安全,如下所示:
在Chrome中停用相同的原产地策略
这是如何为我工作。 对于使用Bracket和AngularJS进行testing的Windows用户
1)转到您的桌面
2)右键单击桌面,在popup的下拉对话框中查找“NEW”,它将展开
3)select快捷方式
4)打开一个对话框
5)点击浏览并寻找谷歌浏览器。
6)点击确定 – >下一步 – >完成,它会在您的桌面上创build谷歌快捷方式
7)现在右键单击刚刚创build的Google Chrome图标
8)点击属性
9)在目标path中input
"C:\Program Files\Google\Chrome\Application\chrome.exe" --args --disable-web-security
10)保存
11)双击你新创build的Chrome快捷方式,并在地址栏中通过你的链接,它将工作。