token无感刷新,即token过期后,前端主动向后端发送请求返回新token替代旧token,在用户无感知的情况下可以一直保持登录状态的功能。
问题:
1、如果同时多个接口返回401(token失效),应该如何处理
2、解决了多个接口重新请求的问题,如何保证接口的逻辑继续进行下去,例如获取后端数据后赋值的接口401,前端重新请求回token后重新请求一次这个接口,如何保证数据可以再次重新进行赋值的问题。
首先声明两个变量。
然后在响应拦截器拦截到401报错(与后端商定)
// 是否正在刷新的标记
let isRefreshing = false
//重试队列
let requestList = []
export const request = (options) => {
//加载loading
uni.showLoading({
title: '加载中'
})
return new Promise((resolve, reject) => {
uni.request({
...options,
// 请求成功
success: (res) => {
if (res.data.code >= 200 && res.data.code <= 300) {
resolve(res.data)
} else if (res.data.code === 401 && uni.getStorageSync('token')) { //token过期
new Promise((newResolve) => {
requestList.push(() => {
resolve(request(options))
})
})
if (!isRefreshing) {
isRefreshing = true
return store.dispatch('getNewToken').then(() => {
requestList.forEach((cb) => {
cb(options)
})
requestList = []
return
}).catch(() => {
store.dispatch('clearUserInfo')
uni.reLaunch({
url: '/pages/login/index'
})
})
.finally(() => {
isRefreshing = false
})
}
} else {
uni.showToast({
title: res.data.msg,
icon: "none",
duration: 2000
})
reject(res.data)
}
},
// 请求失败
fail: (err) => {
uni.showToast({
title: '请求接口失败!',
icon: "none",
duration: 2000
})
reject(err)
},
//请求结束之后,执行的回调函数(成功或失败都会执行)
complete() {
//隐藏loading
uni.hideLoading({
noConflict: true
})
}
})
})
}