我尝试从我的角度登录服务发布:
$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";
有趣的是,邮递员可以工作。 我该怎么办?
谢谢。
您的请求包含非简单标头
Content-type
和 signature
,它们必须包含在响应的 Access-Control-Allow-Headers
标头中。
(
Content-type
有时是一个简单的标头,但仅适用于特定值。application/json
不是这些值之一,它会导致Content-type
变得不简单。)
将
Content-type
添加到服务器预检响应中的 Access-Control-Allow-Headers
。
POSTMAN不受同源策略约束,因此不需要服务器支持CORS。
您的浏览器是否在发布之前发出 OPTIONS 请求? 检查网络选项卡 我之前遇到过问题,浏览器或 Angular(不知道是哪一个)发出 OPTIONS 请求,而服务器没有...
“访问控制允许方法”:“GET、POST”、“PUT”、“DELETE”、“OPTIONS”;
不确定您是否已经拥有所需的信息。但是在我的本地网络服务器中 - 当我使用邮递员发出 http 请求时,它会添加到标头中:
标题: { 主机:'本地主机', 连接:“保持活动”, pragma: '无缓存', '缓存控制': '无缓存', 'user-agent': '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 中看到的内容: [ '主持人', '本地主机', '联系', '活着', '杂注', '无缓存', '缓存控制', '无缓存', '用户代理', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, 如 Gecko) Chrome/47.0.2526.106 Safari/537.36', '接受', '/', '推荐人', 'http://localhost/', '接受编码', 'gzip、放气、sdch', '接受语言', 'en-US,en;q=0.8'],
因此,也许您只需要伪造您的客户端即可成为可识别的浏览器客户端。
当从 Angular 发送内容类型为
application/json
的 POST 请求时,由于 CORS(跨源资源共享)预检检查,服务器可能会响应 OPTIONS 请求。这是浏览器检查服务器是否允许请求的方法和标头的标准安全措施。
如果您只想接受 GET、POST、PUT 和 DELETE 等某些方法,并且发现使用
application/json
会触发 OPTIONS 请求,则可以尝试使用 application/x-www-form-urlencoded
或纯文本 (text/plain
) 与 POST 方法。这可以帮助避免 OPTIONS 请求,直接向服务器发送 POST 请求。此外,请确保服务器配置为通过包含适当的 CORS 标头(例如“Access-Control-Allow-Methods”)来接受所需的方法。