token无感刷新,解决所有问题!

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
				})
			}
		})
	})
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值