一、withCredentials是什么?
withCredentials
是浏览器 XMLHttpRequest 或 Fetch API(以及 axios 等基于它们的库)中的一个配置项,作用是控制跨域请求时是否携带 Cookie、HTTP 认证信息等凭证。
用更通俗的方式解释:
二、核心作用
它就像一个 "通行证开关":
- 当设为
true
时:跨域请求会带上当前域名下的 Cookie、HTTP 认证信息(如用户名密码)等 "身份凭证" - 当设为
false
时(默认值):跨域请求会自动忽略这些凭证,服务器无法识别你的身份
三、适用场景
跨域登录状态维持
比如你的前端在a.com
,后端接口在b.com
:- 登录成功后,后端会在
b.com
域名下种一个 Cookie 作为登录凭证 - 后续发请求时,如果
withCredentials: true
,浏览器会把这个 Cookie 带给b.com
服务器,证明 "我已经登录过" - 如果不开启,服务器会把你当成未登录用户
- 登录成功后,后端会在
跨域需要认证的接口
对于需要 HTTP 基础认证(账号密码)、或依赖 Cookie 做权限校验的接口,必须开启这个配置才能正常访问。
四、注意事项
后端必须配合
服务器响应头必须包含Access-Control-Allow-Credentials: true
,否则即使前端开了withCredentials
,浏览器也会拒绝接收响应。影响跨域范围
当使用withCredentials
时,后端Access-Control-Allow-Origin
不能设为*
(通配符),必须指定具体的前端域名(如https://a.com
)。同域请求不受影响
只有跨域请求时这个配置才起作用,同域名下的请求会自动携带凭证,无需手动设置。
简单说,withCredentials
就是为了解决 "跨域场景下如何证明我是谁" 的问题,是实现跨域登录状态共享的关键配置。
五、Cookie是什么时候携带上去的
当你设置 withCredentials: true
后,Cookie 的携带是自动的,不需要你手动写任何代码去附加 Cookie。
具体来说:
Cookie 由服务器种下
比如登录成功时,服务器会通过响应头Set-Cookie: xxx=xxx
把 Cookie 存到浏览器里(这一步是服务器做的,前端不用管)。浏览器自动携带
当你下次用withCredentials: true
发请求到同一个服务器域名时,浏览器会自动找出该域名下的 Cookie,偷偷加到请求头里发给服务器。
举个例子:
- 你登录
api.xxx.com
后,浏览器保存了服务器给的token=abc123
Cookie - 之后你用 axios 发请求:
axios.post('https://api.xxx.com/data', data, { withCredentials: true // 关键配置 })
- 浏览器会自动在请求头里加
Cookie: token=abc123
,你不用手动写这行代码
你只需要保证两点:
- 前端请求时打开
withCredentials: true
开关 - 服务器之前已经给浏览器种下了该域名的 Cookie
剩下的携带工作,浏览器会自动完成,不用你手动处理 Cookie 内容。
六、大白话阐述(更好理解)
withCredentials
就是用来控制 axios 发送请求时,是否带上 Cookie 信息 的开关。
举个例子:
- 当你登录某个网站后,服务器会给你一个 Cookie 作为 "身份凭证"
- 之后你再发请求时,如果
withCredentials: true
,axios 就会自动带上这个 Cookie,服务器就能认出你是谁 - 如果是
false
(默认值),就不会带 Cookie,服务器可能会把你当成未登录的新用户
这个参数主要用在 跨域请求 场景,比如你的前端和后端不在同一个域名下时,需要显式设置 withCredentials: true
才能让 Cookie 正常传递,否则跨域请求会丢失 Cookie 信息。