← 返回文章列表
浏览器与网络·854 次阅读

跨域与 CORS:浏览器到底在拦什么

跨域与 CORS:浏览器到底在拦什么

前端 localhost:3000 请求后端 localhost:4000 报 CORS 错误,是初学者必踩的坑。先纠正一个误解:请求其实发出去了,服务器也正常处理了,是浏览器拦下了响应。

同源策略

协议、域名、端口三者完全一致才叫同源。浏览器规定:跨源的 AJAX 请求,默认不允许读取响应。这是安全限制——防止恶意网站带着你的 Cookie 偷读银行网站的数据。

注意:<img>、<script src> 标签加载资源不受同源策略限制,这就是 JSONP 的原理(现在基本不用了)。

CORS:跨源资源共享

CORS 是 W3C 标准,思路是服务器主动声明哪些源可以访问。

简单请求(GET/POST/HEAD + 常见简单头):浏览器直接发,服务器返回 Access-Control-Allow-Origin:

// Express 配置
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000')
res.setHeader('Access-Control-Allow-Credentials', 'true') // 允许带 Cookie

预检请求:当请求带自定义头(如 Authorization)、用 PUT/DELETE、Content-Type 为 application/json 时,浏览器会先发一个 OPTIONS 请求"探路",服务器批准后才发真正的请求:

res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,OPTIONS')
res.setHeader('Access-Control-Allow-Headers', 'Content-Type,Authorization')
res.setHeader('Access-Control-Max-Age', '86400') // 预检结果缓存一天

开发环境怎么办

  • 让后端开 CORS(或用 cors 中间件)
  • 用开发服务器的代理:Vite/Webpack 配置 server.proxy,把 /api 转发到目标服务器,浏览器看来是同源

生产环境前后端同域名部署(Nginx 反代),跨域问题自然消失。带 Cookie 的跨源请求,前端要设 credentials: 'include',且 Allow-Origin 不能写 *,必须写明具体域名。

看到这里了?如果这篇文章帮到过你

请我喝瓶可乐就好 🥤

收款码

评论0 条

还没有评论,来抢沙发~

发表评论

评论需审核后显示

© 2026 许冬博客 · 专注 JS 技术分享

·RSS 订阅·Powered by Nuxt 4