vue 拦截器拦截401重新请求Token 无感刷新Token 之后重新请求报401的接口
instance.interceptors.response.use(
async (response) => {
let { data } = response;
if (data.code === 401 || data.code === 403) {
return await handleExpiredToken(response.config);
}
if (data.code !== 200) {
return Promise.reject(data);
} else {
return Promise.resolve(data);
}
},
async (error) => {
if (!error || !error.response) {
handleNetworkError();
return Promise.reject('Network anomaly');
}
switch (error.response.status) {
case 401:
case 403:
return await handleExpiredToken(error.config);
case 500:
handleServerError(error.response.data.code);
break;
case 502:
Message.error('Server error');
break;
default:
break;
}
return Promise.reject(error.response.data.message);
}
);
let isRefreshing = false;
let pendingRequests = [];
const handleExpiredToken = async (originalRequest) => {
if (isRefreshing) {
return new Promise((resolve, reject) => {
pendingRequests.push({ originalRequest, resolve, reject });
});
}
isRefreshing = true;
try {
const params = {
refreshToken: localStorage.getItem('refreshToken'),
grantType: 'refreshToken'
};
const response = await login(params);
const { accessToken, refreshToken } = response.data;
localStorage.setItem('token', accessToken);
localStorage.setItem('refreshToken', refreshToken);
processPendingRequests(accessToken);
originalRequest.headers['Authorization'] = `Bearer ${accessToken}`;
return await instance(originalRequest);
} catch (error) {
console.log('error--------', error);
localStorage.clear();
router.push('/login');
processPendingRequests(null);
} finally {
isRefreshing = false;
}
}
const processPendingRequests = (accessToken) => {
pendingRequests.forEach(({ originalRequest, resolve, reject }) => {
if (accessToken) {
originalRequest.headers['Authorization'] = `Bearer ${accessToken}`;
resolve(instance(originalRequest));
} else {
reject('Token refresh failed');
}
});
pendingRequests = [];
};