Token过期后怎么自动刷新还不让用户感知?
我在用 JWT 做用户认证,前端每次请求都带 Authorization: Bearer xxx。但 token 一小时就过期,过期后接口返回 401,用户就得重新登录,体验太差了。
我看别人说可以用 refresh token 自动续期,但我试了下,在 axios 的 response interceptor 里拦截 401 后去请求新 token,结果发现如果多个请求同时触发 401,会发好几次刷新请求,还可能拿不到最新的 access token。有没有靠谱的处理方式?
axios.interceptors.response.use(
res => res,
async err => {
if (err.response?.status === 401) {
const newToken = await refreshToken(); // 这里并发会出问题
localStorage.setItem('token', newToken);
// 重试原请求...
}
}
);
简单说,用一个 isRefreshing 标记位来控制:
关键点就两个:
一个是 isRefreshing 标志位,保证同一时间只有一个刷新请求在跑。
另一个是 requests 队列,刷新期间发过来的请求先存着,等新 token 拿到后统一重发。
还有个小细节,refreshToken 这个接口本身要用不同的方式处理,别把自己也拦截成 401 了搞出死循环——比如用不带拦截器的 axios 实例去调刷新接口,或者在拦截器里判断 url。
这样多个请求同时 401 只会触发一次刷新,用户完全无感知,体验就和正常请求一样。