POSTMAN 工作时出现 Angular POST 跨源错误

问题描述 投票:0回答:4

我尝试从我的角度登录服务发布:

$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";

有趣的是,邮递员可以工作。 我该怎么办?

谢谢。

javascript angularjs cross-domain cors access-control
4个回答
9
投票

您的请求包含非简单标头

Content-type
signature
,它们必须包含在响应的
Access-Control-Allow-Headers
标头中。

Content-type
有时是一个简单的标头,但仅适用于特定值。
application/json
不是这些值之一,它会导致
Content-type
变得不简单。)

Content-type
添加到服务器预检响应中的
Access-Control-Allow-Headers

POSTMAN不受同源策略约束,因此不需要服务器支持CORS。


3
投票

您的浏览器是否在发布之前发出 OPTIONS 请求? 检查网络选项卡 我之前遇到过问题,浏览器或 Angular(不知道是哪一个)发出 OPTIONS 请求,而服务器没有...

“访问控制允许方法”:“GET、POST”、“PUT”、“DELETE”、“OPTIONS”;


0
投票

不确定您是否已经拥有所需的信息。但是在我的本地网络服务器中 - 当我使用邮递员发出 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'],

因此,也许您只需要伪造您的客户端即可成为可识别的浏览器客户端。


0
投票

当从 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”)来接受所需的方法。

© www.soinside.com 2019 - 2024. All rights reserved.