大家好,我是刘布斯。
今天咱聊个面试里的“常青树”,也是很多刚入行的小兄弟最郁闷的问题:“凭什么我用 Postman 调接口死活都能通,一回到浏览器写代码就报跨域(CORS)错误?”
这个问题,我带过不少应届生,不少都得在这个坑里蹲一阵子。甚至有些工作两三年的同学,虽然知道怎么配 Access-Control-Allow-Origin,但你要问他“为什么 Postman 没这事儿”,他可能还真得愣一下。
今天咱们从“受害者”的角度聊聊,这到底是怎么一回事。
首先,我们要搞清楚一个最大的误区:跨域报错,从来都不是服务器拒绝了你的请求。
很多同学看到控制台那一串红字,第一反应是:“后端接口挂了”或者“后端把我拒了”。
其实不然。绝大多数情况下,你的请求已经发到了后端,后端也正常处理了,甚至已经把数据返回给你了。但是,当响应回到浏览器的一刹那,浏览器的“保安系统”跳了出来,看了一眼响应头,发现没有合法的“通行证”,反手就把数据给扣下了,顺便给你报了个红。
这个保安系统,就叫同源策略(Same-Origin Policy)。
因为浏览器是极其复杂的公共环境。你可能同时开着你的银行页面,又开着一个不知名的“钓鱼网站”。
如果没有同源策略,钓鱼网站里的 JS 脚本就能轻而易举地向银行接口发请求(带上你的 Cookie),把你账户里的余额看个精光。
所以,浏览器必须得怂,必须得严格。它是为了保护用户(你)的安全,才去限制 JS 脚本的越权行为。
Postman 也是个软件,它也要发网络请求,凭啥它就没跨域问题?
其实道理简单得让你想拍大腿:Postman 不是浏览器,它不需要遵循浏览器的“同源策略”。
a.com)发往另一个域名(b.com)。而 Postman 是一个独立的客户端软件。当你点下“Send”键时,它是直接通过操作系统的网络栈发出的请求,就像你写的 Python 脚本或者 cURL 命令一样。这是我面试喜欢考的一道题。
我问: “如果 Postman 能通,浏览器报跨域,是不是说明后端代码逻辑是完全正确的?”
新手回答: “对啊,Postman 都拿到数据了,说明接口没问题。”
老鸟回答: “不一定。虽然逻辑通了,但说明后端没有配置跨域策略(或者配错了)。在现代 Web 开发里,‘支持跨域’本身就是接口逻辑的一部分。”
你要记住,既然浏览器需要 Access-Control-Allow-Origin 这个头,那后端就得配合给。Postman 能通,是因为它“不看”这个头;浏览器不通,是因为它“必看”这个头。后端如果不给这个头,那这个接口对于前端开发来说,就是“没写完”的。
之前,有个小兄弟跟我争得面红耳赤。
他写了个 DELETE 请求,Postman 删数据删得飞快,结果一上页面就报错,连请求都没发出去(其实是发了,但是 OPTIONS 请求挂了)。
他跟我抱怨:“我在 Postman 中试过了,真的没问题!”
我当时就笑了,告诉他两个真相:
PUT、DELETE 或者带自定义 Header 的 POST)之前,会先发一个 OPTIONS 探测请求。Postman 默认是不发这玩意的。如果后端没处理 OPTIONS,浏览器就直接歇菜,但 Postman 依然跑得欢。withCredentials 的设置问题,这也是 Postman 模拟不出来的。总结一句话:Postman 只能证明你的“业务逻辑”通了,不能证明你的“网络策略”通了。
跨域这事儿,说深不深,说浅也不浅。面试官考你,其实是在考你对浏览器安全模型的理解。
聊到这儿,我也再给正在备战面试或者想提升功底的兄弟们,安利一下我们的前端面试题库:https://fe.ecool.fun/ 和配套的小程序【前端面试题宝典】。
题库已经录入 1600 多道前端面试题,除了八股文,还有现在面试官青睐的场景题,甚至最热的AI与前端相关的面试题已经更新,努力做全网最全最新的前端刷题网站。
有会员购买、辅导咨询的需求,可以通过下面的二维码,联系我们的小助手。
行了,今天就聊到这。下次遇到跨域红字,别再只盯着后端看,也想想那个正在保护你的浏览器“保安”吧。