核心是确保浏览器正确携带会话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 不能为 *:
- 响应头必须包含:
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。解决方法是服务端显式设置:
立即学习“Java免费学习笔记(深入)”;
- 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,避免被跨域接口误覆盖


















