核心是确保浏览器正确携带会话cookie:前端需设credentials: 'include'(fetch)、withcredentials: true(axios/xmlhttprequest),后端须返回access-control-allow-credentials: true及具体origin,并显式配置samesite=none+secure,避免依赖php.ini且注意session初始化顺序。

JavaScript 中处理跨域请求的 Session 凭证丢失,核心不是“存 Session”,而是确保浏览器能把 PHPSESSID(或 JSESSIONID、connect.sid 等)这类会话 Cookie 正确带上——它本身不跨域,必须靠显式配置才能在跨域请求中传输。
前端必须开启凭证携带
默认情况下,fetch、axios 或 XMLHttpRequest 发起的跨域请求不会发送 Cookie。必须主动启用:
-
fetch:每次请求加
{ credentials: 'include' }(不能用'same-origin',否则子域名间失效) -
axios:全局设
axios.defaults.withCredentials = true,或单次请求传{ withCredentials: true } -
原生 XMLHttpRequest:调用
xhr.withCredentials = true(必须在send()前设置)
后端必须返回合法 CORS 凭证头
仅前端开启不够,服务端响应必须明确允许凭证传输,且 Origin 不能为 *:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 响应头必须包含:
Access-Control-Allow-Credentials: true -
Access-Control-Allow-Origin必须是具体协议+域名(如https://your-fe.com),不可写* - 预检请求(OPTIONS)也需返回这两个头,否则浏览器直接拦截
Cookie 的 SameSite 属性必须匹配
Chrome 80+、Firefox 79+ 等现代浏览器默认将无声明的 Cookie 视为 SameSite=Lax,会阻止跨域 POST/AJAX 携带 Cookie。解决方法是服务端显式设置:
- PHP:在
session_start()前调用session_set_cookie_params(),指定'samesite' => 'None'且'secure' => true - 注意:
SameSite=None必须搭配Secure(即 HTTPS 环境),否则浏览器拒绝接受 - 避免依赖 php.ini 的
session.cookie_samesite,某些 PHP 版本(如 7.3 早期)该配置不生效
避免 Session 初始化时机错误
尤其在 ThinkPHP 6 或 Spring Boot 等框架中,Session 中间件若在 CORS 预检(OPTIONS)前就执行,而预检请求不带 Cookie,会导致空 Session 被创建并覆盖原有会话:
- ThinkPHP 6:把
SessionInit中间件放到路由级中间件组中,而非全局中间件 - Spring Boot:确保 CORS 过滤器在 Session 过滤器之前执行
- Tomcat 场景:可修改
context.xml自定义sessionIdCookieName,避免被跨域接口误覆盖
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










