token刷新bug修复

This commit is contained in:
FengHui
2026-05-21 17:15:47 +08:00
parent 18990ff873
commit 36432eb070
3 changed files with 95 additions and 57 deletions

View File

@@ -36,7 +36,6 @@ const encryptPathPrefixes = [
'/app/notice/',
'/app/idCardLogin',
'/app/phoneLogin',
'/refreshToken',
];
const addRefreshSubscriber = (callback) => {
@@ -48,16 +47,11 @@ const notifyRefreshSubscribers = (token) => {
refreshSubscribers = [];
};
const resetRefreshState = () => {
isRefreshing = false;
refreshSubscribers = [];
};
const noEncryptSet = new Set([
'DELETE:/app/job/applyJobCencal',
]);
const isEncryptNeeded = (method, url) => {
export const isEncryptNeeded = (method, url) => {
const pureUrl = url.split('?')[0];
const key = `${method.toUpperCase()}:${pureUrl}`;
if (noEncryptSet.has(key)) return false;
@@ -76,7 +70,7 @@ const isEncryptNeeded = (method, url) => {
return false;
};
const encryptRequestData = (data) => {
export const encryptRequestData = (data) => {
const jsonData = JSON.stringify(data);
// const jsonData = JSON.stringify({a: '1'});
console.log('[请求] 加密前:', jsonData)
@@ -87,7 +81,7 @@ const encryptRequestData = (data) => {
};
};
const handleResponseData = (resData) => {
export const handleResponseData = (resData) => {
try {
if (resData?.encrypted) {
const decrypted = sm4Decrypt(config.sm4Config.key, resData.encryptedData);
@@ -179,18 +173,13 @@ export function createRequest(url, data = {}, method = 'GET', loading = false, h
mask: true
})
}
let Authorization = ''
if (useUserStore().token) {
Authorization = `Bearer ${useUserStore().token}`
}
const header = headers || {};
if(needHeader){
header["Authorization"] = Authorization;
}
const requestData = isEncryptNeeded(method, url) ? encryptRequestData(data) : data;
const doRequest = () => {
if (needHeader) {
header["Authorization"] = useUserStore().token ? `Bearer ${useUserStore().token}` : '';
}
const requestData = isEncryptNeeded(method, url) ? encryptRequestData(data) : data;
return new Promise((resolve, reject) => {
uni.request({
url: config.baseUrl + url,
@@ -199,13 +188,10 @@ export function createRequest(url, data = {}, method = 'GET', loading = false, h
header,
success: resData => {
const responseData = handleResponseData(resData.data)
console.log('[请求] 接口地址:', config.baseUrl + url)
console.log('[请求] 解密后数据:', JSON.stringify(responseData))
// console.log('[请求] 接口地址:', config.baseUrl + url)
// console.log('[请求] 解密后数据:', JSON.stringify(responseData))
// 响应拦截
if (resData.statusCode === 200) {
// const responseData = handleResponseData(resData.data)
// console.log('[请求] 接口地址:', config.baseUrl + url)
// console.log('[请求] 解密后数据:', JSON.stringify(responseData))
const {
code,
msg
@@ -235,7 +221,7 @@ export function createRequest(url, data = {}, method = 'GET', loading = false, h
reject(err)
},
complete: () => {
if (loading) {
if (loading && !isRefreshing) {
uni.hideLoading();
}
}
@@ -247,33 +233,42 @@ export function createRequest(url, data = {}, method = 'GET', loading = false, h
}
const handleTokenExpired = (resolve, reject, retryRequest, loading) => {
if (isRefreshing) {
addRefreshSubscriber((token) => {
if (token) {
retryRequest().then(resolve).catch(reject)
} else {
reject(new Error('刷新token失败'))
}
})
return
}
isRefreshing = true
useUserStore().refreshAccessToken().then((newToken) => {
notifyRefreshSubscribers(newToken)
retryRequest().then(resolve).catch(reject)
}).catch((error) => {
resetRefreshState()
uni.showToast({
title: '登录过期,请重新登录',
icon: 'none'
})
reject(error)
}).finally(() => {
if (loading) {
uni.hideLoading()
return new Promise((innerResolve, innerReject) => {
if (isRefreshing) {
addRefreshSubscriber((token) => {
if (token) {
retryRequest().then(resolve).catch(reject).finally(innerResolve)
} else {
const err = new Error('刷新token失败')
reject(err)
innerReject(err)
}
})
return
}
isRefreshing = true
useUserStore().refreshAccessToken().then((newToken) => {
notifyRefreshSubscribers(newToken)
retryRequest().then(resolve).catch(reject).finally(() => {
isRefreshing = false
refreshSubscribers = []
if (loading) {
uni.hideLoading()
}
innerResolve()
})
}).catch((error) => {
isRefreshing = false
refreshSubscribers = []
uni.showToast({
title: '登录过期,请重新登录',
icon: 'none'
})
reject(error)
innerReject(error)
})
})
}