springboot需正确处理options预检请求,否则浏览器因cors校验失败而拦截跨域请求;关键在于放行options、返回204/200状态及access-control-allow-*响应头,并确保安全过滤器不拦截或提前放行。

HTML 本身不参与 CORS 控制,所有错误都源于浏览器对响应头的校验失败——你看到的报错,99% 是后端没返回正确的头,或者返回了但被中间件/异常处理器吃掉了。
为什么控制台报错但 Network 面板看不到请求
这是预检请求(OPTIONS)被拦下的典型表现:浏览器根本没发主请求,只发了预检,而服务端没正确响应它。
- 检查 Network 面板里有没有
OPTIONS请求,状态码是不是403、405或500 - 如果
OPTIONS返回了200但没带Access-Control-Allow-Methods,主请求照样不会发出 - Spring Boot 2.4+ 默认不处理全局
OPTIONS,@CrossOrigin注解可能完全失效,得配CorsConfigurationSource - Nginx 反向代理时,若没用
if ($http_origin) { ... }判断就硬加头,OPTIONS可能因缺失Access-Control-Allow-Origin被拒
前端写了 credentials: 'include' 却拿不到响应
不是前端代码错了,是后端头配错了:只要开了凭据,Access-Control-Allow-Origin 就不能是 *,且必须和请求头里的 Origin 完全一致(协议 + 域名 + 端口)。
- 开发环境常见错写成
localhost:3000,实际应为http://localhost:3000 - 后端若反射
Origin值(如res.header('Access-Control-Allow-Origin', req.headers.origin)),会引发反射型 CORS 漏洞,生产环境禁用 - 想读自定义响应头(如
X-Request-ID),后端还必须显式设置Access-Control-Expose-Headers: X-Request-ID - Spring Security 默认拦截
OPTIONS,必须在安全配置中调用http.cors(),否则直接 403
为什么本地代理能跑通,上线就报错
Webpack/Vite 的 proxy 是开发期“伪装同源”的手段,不解决 CORS,只绕过它——上线后代理消失,CORS 校验立刻回归真实环境。
-
proxy配置里的target必须是完整 URL(含协议),比如http://api.example.com,不能只写域名 - 上线前必须把 API 地址切回真实域名,否则请求发到
/api/xxx路径,404 - 别信 “本地能跑=线上没问题”,这是最常踩的坑;上线前务必用真实前后端域名直连测试
-
mode: 'no-cors'会让请求发出,但响应变成opaque类型:JavaScript 读不到status、headers、body,仅适合埋点或图片上传
真正难的不是加几个响应头,而是理解预检触发条件、凭据与通配符的互斥、以及异常路径是否透出 CORS 头——很多问题发生在 500 错误页或全局异常处理器里,那里往往忘了补 CORS 头。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











