当我尝试向Activiti REST URL发送GET请求时,使用POSTMAN并配置授权参数( kermit:kermit ),它就像魅力一样。
但是当我尝试做同样的事情时,只使用Angular $ http服务,它会返回以下错误:
XMLHttpRequest无法加载http://localhost:8080/activiti-rest/service/repository/deployments。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许原点“http://localhost:8081”访问。响应的HTTP状态代码为401。
这是我的控制器:
(function() {
'use strict';
angular
.module('doktorat-app-test')
.controller('TestController', TestController);
TestController.$inject = ['$http', '$base64'];
function TestController($http, $base64) {
var tcr = this;
$http.defaults.headers.common['Authorization'] = 'Basic ' + $base64.encode('kermit:kermit');
tcr.text = 'ssdsds';
$http.get('http://localhost:8080/activiti-rest/service/repository/deployments')
.then(function(response){
tcr.text = response.data;
});
}
})();
有没有人遇到过类似的错误? 花了2天时间试图解决这个问题,但没有任何成功。
P.S。我正在使用NodeJS http-server运行我的Angular App,它运行在端口8081上。
答案 0 :(得分:0)
由于您尝试访问http://localhost:8081/
来自http://localhost:8080/
的rest api,浏览器将检查您的服务器是否使用预检请求实现CORS。您可以在以下网址获取有关CORS的详细信息:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
通常,不允许托管在一台服务器上的应用程序访问其他服务器上托管的资源。这种限制现在是所有大多数浏览器现在都可以实现的。
为了使其正常工作,您的其他api服务器必须告知其他服务器也将被允许呼叫。为此,您需要在rest api服务器中实现CORS文件管理器。
由于您没有指定在REST中使用哪个语言,我为JAVA
提供了一个开源CORS过滤器库:
解决了您的问题。
答案 1 :(得分:0)
要允许特定域的CORS,您可以使用如下的中间件:
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "http://localhost:8081");
res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
res.header("Access-Control-Allow-Credentials", "true");
res.header("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization, X-Requested-With");
next();
});