CORS 与 POSTMAN
CORS with POSTMAN
这个问题已经问了好几次了,还是有点不明白:
当我阅读有关
的答案时
No 'Access-Control-Allow-Origin' header
问题,它说应该在请求的服务器上设置一个设置以允许跨域:add_header 'Access-Control-Allow-Origin' '*';
。
但是,请告诉我为什么当从 postman(它是一个客户端)询问时,它工作得很好并且我收到了请求服务器的响应?
谢谢
正如@Musa评论的那样,原因似乎是:
Postman doesn't care about SOP, it's a dev tool not a browser
顺便说一句,这里有一个 chrome extension 可以让它在您的浏览器上运行(这个是针对 chrome,但您可以找到用于 FF 或 Safari 的)。
如果您想了解有关 Cross-Origin 的更多信息以及它为何适用于扩展,请查看 here。
CORS
(跨源资源共享)和SOP
(同源策略)是服务器端配置,客户端决定是否强制执行.
与客户相关
- 大多数浏览器执行它以防止与
CSRF
攻击相关的问题。
- 大多数开发工具不关心。
如果您使用网站并填写表格以提交信息(例如您的社会安全号码),您希望确保信息被发送到您认为它被发送到的网站。因此,默认情况下,浏览器的构建方式是“不要将信息发送到被访问域以外的域”。
最终这变得过于局限,但默认想法仍然保留在浏览器中。不要让网页将信息发送到不同的域。但这都是浏览器检查。 Chrome 和 firefox 等已内置代码,表示“在发送此请求之前,我们将检查目标是否与正在访问的页面匹配”。
Postman(或 cmd 行上的 CURL)没有这些内置检查。您手动与网站交互,因此您可以完全控制发送的内容。
虽然这里的所有答案都很好地解释了 cors 是什么,但您的问题的直接答案是由于邮递员和浏览器存在以下差异。
浏览器:发送 OPTIONS
调用以检查服务器类型并在向 API 端点发送任何新请求之前获取 headers。它检查 Access-Control-Allow-Origin
的位置。考虑到这一点 Access-Control-Allow-Origin
header 只是指定允许哪些所有 CROSS ORIGINS,尽管默认情况下浏览器只允许相同的来源。
Postman:直接发送 GET
、POST
、PUT
、DELETE
等请求,而不检查服务器类型并获取 header Access-Control-Allow-Origin
通过使用 OPTIONS
调用服务器。
一般Postman用于调试,用于开发阶段。但是如果你甚至想阻止邮递员尝试这个。
const referrer_domain = "[enter-the-domain-name-of-the-referrer]"
//check for the referrer domain
app.all('/*', function(req, res, next) {
if(req.headers.referer.indexOf(referrer_domain) == -1){
res.send('Invalid Request')
}
next();
});
使用 browser/chrome 邮递员插件检查 CORS/SOP 喜欢的网站。
请改用桌面应用程序以避免这些控件。
这个问题已经问了好几次了,还是有点不明白:
当我阅读有关
的答案时No 'Access-Control-Allow-Origin' header
问题,它说应该在请求的服务器上设置一个设置以允许跨域:add_header 'Access-Control-Allow-Origin' '*';
。
但是,请告诉我为什么当从 postman(它是一个客户端)询问时,它工作得很好并且我收到了请求服务器的响应?
谢谢
正如@Musa评论的那样,原因似乎是:
Postman doesn't care about SOP, it's a dev tool not a browser
顺便说一句,这里有一个 chrome extension 可以让它在您的浏览器上运行(这个是针对 chrome,但您可以找到用于 FF 或 Safari 的)。
如果您想了解有关 Cross-Origin 的更多信息以及它为何适用于扩展,请查看 here。
CORS
(跨源资源共享)和SOP
(同源策略)是服务器端配置,客户端决定是否强制执行.
与客户相关
- 大多数浏览器执行它以防止与
CSRF
攻击相关的问题。 - 大多数开发工具不关心。
如果您使用网站并填写表格以提交信息(例如您的社会安全号码),您希望确保信息被发送到您认为它被发送到的网站。因此,默认情况下,浏览器的构建方式是“不要将信息发送到被访问域以外的域”。
最终这变得过于局限,但默认想法仍然保留在浏览器中。不要让网页将信息发送到不同的域。但这都是浏览器检查。 Chrome 和 firefox 等已内置代码,表示“在发送此请求之前,我们将检查目标是否与正在访问的页面匹配”。
Postman(或 cmd 行上的 CURL)没有这些内置检查。您手动与网站交互,因此您可以完全控制发送的内容。
虽然这里的所有答案都很好地解释了 cors 是什么,但您的问题的直接答案是由于邮递员和浏览器存在以下差异。
浏览器:发送 OPTIONS
调用以检查服务器类型并在向 API 端点发送任何新请求之前获取 headers。它检查 Access-Control-Allow-Origin
的位置。考虑到这一点 Access-Control-Allow-Origin
header 只是指定允许哪些所有 CROSS ORIGINS,尽管默认情况下浏览器只允许相同的来源。
Postman:直接发送 GET
、POST
、PUT
、DELETE
等请求,而不检查服务器类型并获取 header Access-Control-Allow-Origin
通过使用 OPTIONS
调用服务器。
一般Postman用于调试,用于开发阶段。但是如果你甚至想阻止邮递员尝试这个。
const referrer_domain = "[enter-the-domain-name-of-the-referrer]"
//check for the referrer domain
app.all('/*', function(req, res, next) {
if(req.headers.referer.indexOf(referrer_domain) == -1){
res.send('Invalid Request')
}
next();
});
使用 browser/chrome 邮递员插件检查 CORS/SOP 喜欢的网站。 请改用桌面应用程序以避免这些控件。