fetch 跨域携带 cookie 需前后端协同:前端设 credentials: "include",后端返回 access-control-allow-origin(非*)和 access-control-allow-credentials: true,且 cookie 必须含 secure 与 samesite=none。

Fetch 默认不会携带 Cookie 等凭证信息,跨域请求时若需发送身份凭证(如 session、JWT cookie),必须显式开启 credentials 选项,同时服务端也要配合设置响应头。
1. 前端:设置 credentials 为 "include"
在调用 fetch() 时,必须传入 { credentials: 'include' }。这是关键一步,缺省值 'omit' 会完全忽略凭证,'same-origin' 则只在同源时发送。
-
credentials: 'include'—— 跨域也发 Cookie(需后端允许) -
credentials: 'same-origin'—— 同源才发(默认行为) -
credentials: 'omit'—— 从不发(等价于不设该字段)
示例:
fetch('https://api.example.com/data', {
method: 'GET',
credentials: 'include' // 必须加上这行
})
2. 后端:响应头必须明确允许凭证
仅前端设置 credentials: 'include' 不够,浏览器会检查响应头是否包含:
-
Access-Control-Allow-Origin不能是通配符*,必须指定具体源(如https://your-app.com) -
Access-Control-Allow-Credentials: true—— 显式声明允许携带凭证
例如 Node.js + Express 中的正确写法:
res.header('Access-Control-Allow-Origin', 'https://your-app.com');
res.header('Access-Control-Allow-Credentials', 'true');
注意:Access-Control-Allow-Origin 和 Access-Control-Allow-Credentials 必须同时满足,否则浏览器直接拒绝响应。
3. Cookie 本身要符合跨域发送条件
即使前后端配置都对,浏览器也不会自动发送 Cookie,还需确保:
- Cookie 的
SameSite属性不能是Strict(推荐设为Lax或None) - 如果设为
SameSite=None,则Secure属性必须为true(即只在 HTTPS 下发送) - Cookie 的
Domain要覆盖请求目标域名(例如后端是api.example.com,Cookie 的 Domain 应设为.example.com)
4. 常见错误与排查建议
遇到 401、无 Cookie、CORS 错误时,可按顺序检查:
- 浏览器开发者工具 Network 面板中,看请求头是否有
Cookie字段(没有说明 credentials 没生效) - 看响应头是否含
Access-Control-Allow-Credentials: true和明确的Access-Control-Allow-Origin - 检查 Cookie 是否被浏览器标记为 “blocked”(DevTools → Application → Cookies → 查看 SameSite/Secure 设置)
- 确认请求 URL 协议、域名、端口是否与 Cookie 的 Domain 和 Secure 要求一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











