fetch 默认不发送 cookie,需显式设置 credentials 选项:'same-origin'(同源时发送,最常用)、'include'(跨域也发送,需后端配合 access-control-allow-credentials: true 且 origin 不为 *)或 'omit'(默认,不发送);同时注意 cookie 的 secure、samesite 等属性限制。

Fetch 默认不发送 Cookie,要让请求携带 Cookie,关键在于设置 credentials 选项。
credentials 选项必须显式设置
浏览器出于安全考虑,默认把 credentials 设为 'omit',即不发 Cookie。你需要主动设为 'include'(跨域也要发)或 'same-origin'(仅同源时发):
-
'include':无论同源还是跨域,都带上 Cookie(后端需配合设置Access-Control-Allow-Credentials: true) -
'same-origin':只在同源请求时带 Cookie,最常用也最安全 -
'omit':完全不发 Cookie(默认值)
同源请求只需加 credentials: 'same-origin'
比如向当前域名下的接口登录后获取用户信息:
fetch('/api/user', {
credentials: 'same-origin'
})
只要服务端没禁用 Cookie(如没设 HttpOnly 以外的限制),浏览器会自动附上已有的 Cookie。
跨域请求要前后端同时配合
若请求地址是 https://api.example.com,而页面在 https://app.example.com,属于跨域:
- 前端必须写
credentials: 'include' - 后端响应头必须包含
Access-Control-Allow-Credentials: true - 后端还不能把
Access-Control-Allow-Origin设为*,得指定具体源,比如https://app.example.com
注意 Cookie 的 Secure 和 SameSite 属性
即使设置了 credentials,如果 Cookie 本身有以下限制,也可能不被发送:
-
Secure:只在 HTTPS 下发送,HTTP 页面不会带 -
SameSite=Strict或Lax:可能阻止跨站上下文中的 Cookie 发送(比如从链接跳转触发的 GET 请求) -
HttpOnly:不影响 Fetch 发送,只是 JS 读不到,但浏览器仍会自动携带
开发时建议 Cookie 至少设为 SameSite=Lax,兼顾安全与兼容性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











