401的时候需要重新获取token或者刷新token再继续发起请求
let isRefreshing = false; // 定义一个是否正在刷新token的标记
let retryRequests = []; // 定义一个空数组,承载请求队列
// 系统全局请求对象
const service = axios.create({
baseURL: window.baseUrl,
timeout: requestTimeOut,
responseType: "json",
withCredentials: true,
});
// ...省略其他代码
service.interceptors.response.use(
config => {
// 正常请求
return config.data;
},
error => {
// 异常请求
switch (error.response.status) {
// ...省略其他代码
case 401:
if (!isRefreshing) {
isRefreshing = true; //更新状态
//发起刷新token
reLogin().then(res => {
if (res.errorCode === 0) {
// token存起来
sessionStorage.setItem("AuthorizationToken",res.response.token);
//遍历缓存队列 发起请求 传入最新token
retryRequests.forEach(cb => cb(res.response.token));
// 重试完清空这个队列
retryRequests = [];
service(error.response.config);
} else {
// Toast.fail("登录状态已过期,请重新登录");
// router.push("/login");
}
});
// 正在刷新token,返回一个未执行resolve的promise
} else {
return new Promise(resolve => {
// 将resolve放进队列,用一个函数形式来保存,等token刷新后调用执行
retryRequests.push(token => {
error.response.config.headers.Authorization = token;
resolve(service(error.response.config));
});
});
}
break;
default:
// Toast.fail("很抱歉,服务连接异常");
break;
})
不足之处,恳请大佬指正!