修复无感刷新问题

This commit is contained in:
junleea 2025-06-03 11:20:51 +08:00
parent f7edb81a38
commit 6a81db1133
2 changed files with 27 additions and 107 deletions

View File

@ -15,7 +15,16 @@ const request = axios.create({
}); });
// 请求拦截器 - 添加token // 请求拦截器 - 添加token
request.interceptors.request.use(); request.interceptors.request.use(
config => {
const token = localStorage.getItem("token");
if (token) {
config.headers.Authorization = `Bearer ${token}`;
config.headers.token = token;
}
return config;
}
);
// 响应拦截器 // 响应拦截器
request.interceptors.response.use( request.interceptors.response.use(
@ -28,7 +37,6 @@ request.interceptors.response.use(
// 检测到token过期 // 检测到token过期
if (isRefreshing == false) { if (isRefreshing == false) {
isRefreshing = true; isRefreshing = true;
// 这里需要替换为实际的refresh token请求 // 这里需要替换为实际的refresh token请求
return axios.post('https://uc.ljsea.top/user/refresh_token', { return axios.post('https://uc.ljsea.top/user/refresh_token', {
refresh_token: localStorage.getItem("refresh_token") refresh_token: localStorage.getItem("refresh_token")
@ -39,6 +47,7 @@ request.interceptors.response.use(
}).then(res => { }).then(res => {
const token = res.data["data"]["access_token"]; const token = res.data["data"]["access_token"];
localStorage.setItem("token", token); localStorage.setItem("token", token);
//alert("token: " + token);
// 重试所有挂起的请求 // 重试所有挂起的请求
requests.forEach(cb => cb(token)); requests.forEach(cb => cb(token));
@ -59,7 +68,9 @@ request.interceptors.response.use(
// 正在刷新token将请求放入队列 // 正在刷新token将请求放入队列
return new Promise(resolve => { return new Promise(resolve => {
requests.push(token => { requests.push(token => {
//alert("new token: " + token);
result.config.headers.Authorization = `Bearer ${token}`; result.config.headers.Authorization = `Bearer ${token}`;
result.config.headers.token = token;
resolve(request(result.config)); resolve(request(result.config));
}); });
}); });
@ -76,56 +87,6 @@ request.interceptors.response.use(
} else { } else {
return result.data; return result.data;
} }
},
error => {
if (error.response && error.response.status === 401 && !isRefreshing) {
// 处理401未授权错误
const originalRequest = error.config;
if (!isRefreshing) {
isRefreshing = true;
return axios.post(baseURL+'user/refresh', {
refresh_token: localStorage.getItem("refresh_token")
},{
headers: {
'Authorization': `Bearer ${localStorage.getItem("refresh_token")}`
}
}).then(res => {
if (res.data.code !== 0) {
ElMessage.error('登录已过期,请重新登录!');
localStorage.removeItem("token");
localStorage.removeItem("refresh_token");
router.push("/login");
}
const { token, refresh_token } = res.data;
localStorage.setItem("token", token);
localStorage.setItem("refresh_token", refresh_token);
requests.forEach(cb => cb(token));
requests = [];
isRefreshing = false;
originalRequest.headers.Authorization = `Bearer ${token}`;
return request(originalRequest);
}).catch(err => {
ElMessage.error('登录已过期,请重新登录!');
localStorage.removeItem("token");
localStorage.removeItem("refresh_token");
router.push("/login");
return Promise.reject(err);
});
} else {
return new Promise(resolve => {
requests.push(token => {
originalRequest.headers.Authorization = `Bearer ${token}`;
originalRequest.headers.token = token;
resolve(request(originalRequest));
});
});
}
}
ElMessage.error('请求失败,请稍后重试!');
return Promise.reject(error);
} }
); );

View File

@ -16,7 +16,16 @@ const request = axios.create({
}); });
// 请求拦截器 - 添加token // 请求拦截器 - 添加token
request.interceptors.request.use(); request.interceptors.request.use(
config => {
const token = localStorage.getItem("token");
if (token) {
config.headers.Authorization = `Bearer ${token}`;
config.headers.token = token;
}
return config;
}
);
// 响应拦截器 // 响应拦截器
request.interceptors.response.use( request.interceptors.response.use(
@ -29,7 +38,6 @@ request.interceptors.response.use(
// 检测到token过期 // 检测到token过期
if (isRefreshing == false) { if (isRefreshing == false) {
isRefreshing = true; isRefreshing = true;
// 这里需要替换为实际的refresh token请求 // 这里需要替换为实际的refresh token请求
return axios.post('https://uc.ljsea.top/user/refresh_token', { return axios.post('https://uc.ljsea.top/user/refresh_token', {
refresh_token: localStorage.getItem("refresh_token") refresh_token: localStorage.getItem("refresh_token")
@ -38,21 +46,14 @@ request.interceptors.response.use(
'Authorization': `Bearer ${localStorage.getItem("refresh_token")}` 'Authorization': `Bearer ${localStorage.getItem("refresh_token")}`
} }
}).then(res => { }).then(res => {
if (res.data.code !== 0 || res.data.data === null) {
ElMessage.error('登录已过期,请重新登录!');
localStorage.removeItem("token");
localStorage.removeItem("refresh_token");
router.push("/login");
}
const token = res.data["data"]["access_token"]; const token = res.data["data"]["access_token"];
localStorage.setItem("token", token); localStorage.setItem("token", token);
//alert("token: " + token);
// 重试所有挂起的请求 // 重试所有挂起的请求
requests.forEach(cb => cb(token)); requests.forEach(cb => cb(token));
requests = []; requests = [];
//isRefreshing = false; isRefreshing = false;
// 重试当前请求 // 重试当前请求
const config = result.config; const config = result.config;
@ -64,10 +65,11 @@ request.interceptors.response.use(
router.push("/login"); router.push("/login");
return Promise.reject(err); return Promise.reject(err);
}); });
} else{ } else if (isRefreshing) {
// 正在刷新token将请求放入队列 // 正在刷新token将请求放入队列
return new Promise(resolve => { return new Promise(resolve => {
requests.push(token => { requests.push(token => {
//alert("new token: " + token);
result.config.headers.Authorization = `Bearer ${token}`; result.config.headers.Authorization = `Bearer ${token}`;
result.config.headers.token = token; result.config.headers.token = token;
resolve(request(result.config)); resolve(request(result.config));
@ -86,49 +88,6 @@ request.interceptors.response.use(
} else { } else {
return result.data; return result.data;
} }
},
error => {
if (error.response && error.response.status === 401 && !isRefreshing) {
// 处理401未授权错误
const originalRequest = error.config;
if (!isRefreshing) {
isRefreshing = true;
return axios.post(baseURL+'user/refresh', {
refresh_token: localStorage.getItem("refresh_token")
},{
headers: {
'Authorization': `Bearer ${localStorage.getItem("refresh_token")}`
}
}).then(res => {
const { token, refresh_token } = res.data;
localStorage.setItem("token", token);
localStorage.setItem("refresh_token", refresh_token);
requests.forEach(cb => cb(token));
requests = [];
isRefreshing = false;
originalRequest.headers.Authorization = `Bearer ${token}`;
return request(originalRequest);
}).catch(err => {
ElMessage.error('登录已过期,请重新登录!');
localStorage.removeItem("token");
localStorage.removeItem("refresh_token");
router.push("/login");
return Promise.reject(err);
});
} else {
return new Promise(resolve => {
requests.push(token => {
originalRequest.headers.Authorization = `Bearer ${token}`;
resolve(request(originalRequest));
});
});
}
}
ElMessage.error('请求失败,请稍后重试!');
return Promise.reject(error);
} }
); );