参考:https://blog.csdn.net/m0_56683897/article/details/131836591
1,access_token 短期的,接口调用需要的token
2,refresh_token 时间长一点的,用来刷新access_token的
直接上代码
let isRefreshing = false;
let requestsList = [];
//HTTPresponse拦截
axios.interceptors.response.use(
res => {
NProgress.done();
const status = res.data.code;
if (status !== 200 && status !== 401) {
// 错误捕获处理
return Promise.reject(new Error(res.data.message || 'Error'));
}
if (status === 401) {
if (!isRefreshing) {
isRefreshing = true;
//调接口,刷新token
const oldrefreshToken = getRefreshToken();
return refreshToken(oldrefreshToken)
.then(result => {
const data = result?.data?.data;
if (data?.accessToken) {
// 刷新成功
store.commit('SET_TOKEN', data.accessToken);
store.commit('SET_REFRESH_TOKEN', data.refreshToken);
store.commit('SET_USER_INFO', data);
const cryptoToken = res.config.cryptoToken === true;
const token = getToken();
res.config.headers.Authorization = cryptoToken
? 'crypto ' + crypto.encrypt(token)
: 'bearer ' + token;
requestsList.length > 0 &&
requestsList.map(cb => {
cb();
});
requestsList = []; // 注意要清空
return axios(res.config);
} else {
// 刷新失败 退出登录
store.dispatch('LogOut').then(() => {
router.push({ path: '/login' });
});
}
})
.catch(err => {
//刷新失败 退出登录
store.dispatch('LogOut').then(() => {
router.push({ path: '/login' });
});
return err;
})
.finally(() => {
isRefreshing = false;
});
} else {
// 正在刷新token ,把后来的接口缓冲起来
return new Promise(resolve => {
requestsList.push(() => {
res.config.headers.Authorization = getToken();
resolve(axios(res.config));
});
});
}
}
return Promise.resolve(res);
},
error => {
NProgress.done();
return Promise.reject(new Error(error));
}
);