复用单个 Headers 实例统一管理 Token,通过 setToken/clearToken 动态更新,fetch 时直接传入该实例,并配合 401 拦截与刷新逻辑确保鉴权同步。

用 Fetch 的 Headers 对象统一管理 Token,核心是**复用一个可变的 Headers 实例,在每次请求前动态注入最新 Token**,而不是在每个 fetch() 调用里手动拼写 Authorization: Bearer xxx。这样既避免遗漏,也方便集中刷新、失效处理和调试。
创建可复用的 Headers 实例
不要每次请求都 new Headers(),而是初始化一个共享实例,并提供方法更新 Token:
- 用
new Headers()创建一次,作为“凭证容器” - 封装
setToken(token)方法,内部调用headers.set('Authorization', 'Bearer ' + token) - 封装
clearToken()方法,调用headers.delete('Authorization')
示例:
const authHeaders = new Headers();
export const setToken = (token) => {
if (token) {
authHeaders.set('Authorization', `Bearer ${token}`);
} else {
authHeaders.delete('Authorization');
}
};
export const clearToken = () => authHeaders.delete('Authorization');在 fetch 中直接传入 Headers 实例
Fetch 支持直接把 Headers 对象传给 headers 选项,它会自动合并(注意:不是覆盖整个 headers,而是按 key 合并):
- 传入
{ headers: authHeaders }即可,无需展开或转为普通对象 - 若某次请求需要额外 header(如
Content-Type),可新建临时 Headers 并先 append 共享的鉴权头:const reqHeaders = new Headers(authHeaders); reqHeaders.set('Content-Type', 'application/json');
配合 Token 刷新与拦截逻辑使用
Headers 对象本身不感知 Token 过期,需结合业务逻辑主动维护:
- 登录成功后立即调用
setToken(newToken) - 401 响应时调用
clearToken(),并触发重新登录流程 - 若支持自动刷新(如用 refresh token),刷新成功后再次调用
setToken(refreshedToken) - 可在自定义请求函数中统一加 try/catch 和 401 处理,确保 Headers 始终同步状态
注意事项与避坑点
Headers 是不可直接遍历的类数组对象,且某些操作有隐式行为:
-
headers.get('authorization')不区分大小写,但set()写入的 key 会保留原始大小写(推荐统一用小写键名) - 不能用
headers['Authorization'] = ...,必须用set()/get()方法 - 传给 fetch 的 Headers 实例会被只读冻结 —— 所以更新 Token 必须在发起请求之前完成
- 避免在多个并发请求中交叉修改同一 Headers 实例(例如 A 请求刚 set,B 请求立刻 clear),建议搭配 Promise 链或状态锁控制










