我尝试从我的角度登录服务进行POST:
$http.post('https://xyz/login',
{
headers: {
'Content-type': 'application/json',
'Accept': 'application/json',
'signature': 'asd'
}
我得到了这个错误:
XMLHttpRequest cannot load https://xyz/login. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:1337' is therefore not allowed access.
我试过这个标题:
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
还有这些:
"Access-Control-Allow-Origin": "*";
"Access-Control-Allow-Headers": "X-Requested-With";
"Access-Control-Allow-Methods": "GET, POST", "PUT", "DELETE";
有趣的是,POSTMAN是有效的。我该怎么办?
谢谢。
您的请求包含非简单标头Content-type
和signature
,它们必须包含在响应的Access-Control-Allow-Headers
标头中。
(Content-type
有时是一个简单的标头,但仅适用于特定值。application/json
不是这些值之一,它会导致Content-type
变得不简单。)
在服务器的飞行前响应中将Content-type
添加到Access-Control-Allow-Headers
。
POSTMAN不受同源策略的约束,因此它不需要服务器的CORS支持。
您的浏览器是否在发布前发出OPTIONS请求?检查"NET"选项卡我以前遇到过浏览器或Angular发出OPTIONS请求的问题(不知道是哪一个),而服务器没有。。。
"访问控制允许方法":"GET,POST","PUT","DELETE","OPTIONS";
不确定您是否已经拥有所需的信息。但在我的本地web服务器中,当我使用poster发出http请求时,它会在标题中添加以下内容:
标头:{host:'localhost',connection:"保持活动",pragma:"无缓存","缓存控制":"无缓存","用户代理":"Mozilla/5.0(Windows NT 10.0;WOW64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/47.02526.106 Safari/537.36",accept:'/',referr:'http://localhost/',"accept encoding":"gzip,deflate,sdch",'接受语言':'en-US,en;q=0.8'},
下面是我在rawHeaders中看到的内容:["主机",'localhost','连接',"保持活力","Pragma","无缓存",'缓存控制',"无缓存",'用户代理',"Mozilla/5.0(Windows NT 10.0;WOW64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/47.02526.106 Safari/537.36",'接受','/','裁判','http://localhost/','接受编码','gzip,deflate,sdch','接受语言','en-US,en;q=0.8'],
所以,也许你只需要假装你的客户端是一个公认的浏览器客户端。