Token过期后如何自动刷新并重试请求?
我在用React做登录功能,接口返回401时想自动刷新token再重试原请求,但不知道怎么优雅地处理。试过在拦截器里刷新,但遇到多个请求同时过期时会重复刷新。
现在代码大概是这样:
const api = axios.create();
api.interceptors.response.use(
res => res,
async (error) => {
if (error.response?.status === 401) {
const newToken = await refreshToken(); // 这里可能被多次调用
localStorage.setItem('token', newToken);
return api(error.config); // 重试原请求
}
return Promise.reject(error);
}
);
解决思路很简单:加个标志位把刷新行为锁住,然后用队列把后续请求存起来,等token刷新成功后再逐个重试。
直接上代码:
几个关键点说明一下:
第一个请求401时,isRefreshing从false变成true,同时把请求塞进队列。然后axios重试这个请求时会走else分支,也进队列等待。等refreshToken完成,队列里的请求一个个用新token发出去。
这里用Promise把异步操作串起来了,避免重复刷新的问题。
如果刷新token本身也失败了(比如refresh token也过期了),那就直接跳登录页吧,别挣扎了。