我尝试从我的角度登录服务发布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是有效的。 我该怎么办?
感谢。
答案 0 :(得分:6)
您的请求包含非简单标题Content-type
和signature
,这些标题必须包含在回复的Access-Control-Allow-Headers
标题中。
(Content-type
有时是一个简单的标头,但仅适用于特定值。application/json
不是其中一个值,它会导致Content-type
变得非简单。)
在服务器的预检响应中将Content-type
添加到Access-Control-Allow-Headers
。
POSTMAN不受同源策略的约束,因此不需要服务器提供CORS支持。
答案 1 :(得分:2)
您的浏览器是否在POST之前发出OPTIONS请求? 检查NET选项卡 我之前遇到过浏览器或Angular(不知道哪个)以及服务器没有提出OPTIONS请求的问题......
“Access-Control-Allow-Methods”:“GET,POST”,“PUT”,“DELETE”,“OPTIONS”;
答案 2 :(得分:0)
不确定您是否已拥有所需信息。但是在我的本地网络服务器中 - 当我使用邮递员发出http请求时,它会添加到标题中:
标头: {host:' localhost', 连接:'保持活力', pragma:' no-cache', '缓存控制':' no-cache', '用户代理':' Mozilla / 5.0(Windows NT 10.0; WOW64)AppleWebKit / 537.36(KHTML,如Gecko)Chrome / 47.0.2526.106 Safari / 537.36', 接受:' / ', 引用者:' http://localhost/', '接受编码':' gzip,deflate,sdch', '接受语言':' en-US,en; q = 0.8' },
以下是我在rawHeaders中看到的内容: ['主持人', '本地主机&#39 ;, '连接&#39 ;, '保持活动#39 ;, '附注&#39 ;, '无缓存&#39 ;, '缓存控制&#39 ;, '无缓存&#39 ;, '用户代理&#39 ;, ' Mozilla / 5.0(Windows NT 10.0; WOW64)AppleWebKit / 537.36(KHTML,如Gecko)Chrome / 47.0.2526.106 Safari / 537.36', '接受&#39 ;, ' / &#39 ;, ' Referer的&#39 ;, ' http://localhost/&#39 ;, '接受编码&#39 ;, ' gzip,deflate,sdch', '接受 - 语言&#39 ;, ' EN-US,EN; Q = 0.8' ],
所以,或许你只需要假装你的客户端成为公认的浏览器客户端。