uniapp请求request封装时统一处理token过期的解决方案

该博客讨论了在uniapp中如何封装request请求,以便在token过期时进行统一处理。当后端返回特定状态码表示token过期时,程序会先获取新的token,然后重新发起请求。这种方法虽然会导致额外的请求,但能确保处理逻辑集中,避免在各页面中重复处理。另一种方案是在请求前检查token的过期时间,减少请求次数,但可能需要引用工具函数并面临时间同步的问题。

项目场景:

uniapp封装request时,token过期后统一处理


问题描述

请求头需要token,token有时间,时间到了,后端会返回一个状态码标志token过期了,需要重新获取token,之后再次请求此接口获取数据。
httpTokenRequest是封装的request方法

const httpTokenRequest = (opts, data) => {
	let token = uni.getStorageSync('token')
		let httpDefaultOpts = {
			url: baseUrl + opts.url,
			data: opts.data,
			method: opts.method,
			header: opts.method == 'GET' ? {
				'X-ACCESS-TOKEN': token,
				'X-Requested-With': 'XMLHttpRequest',
				"Accept": "application/json",
				"Content-Type": "application/json; charset=UTF-8"
			} : {
				'X-ACCESS-TOKEN': token,
				'X-Requested-With': 'XMLHttpRequest',
				'Content-Type': 'application/json; charset=UTF-8'
			},
			dataType: 'json',
		}
		let promise = new Promise(function(resolve, reject) {
			uni.request(httpDefaultOpts).then(  
				(res) => {
					if(res[0] && res[0].errMsg){
						uni.showToast({
							title: '网络异常!',
							icon: 'none'
						});
					}else{
						if(res[1].data.code == 1600){
							//1600代表token过期,此时会调用获取token的接口
							getToken().then(res =>{
								//token获取成功后,httpTokenRequest自己调用自己,注意:由于上一个httpTokenRequest里的promise没有执行完就调用自己又开启一个promise,所以
								//then返回的res是调用自己后reslove(res[1])的结果。reslove(res),才是最后返回的数据
								httpTokenRequest(opts, data).then(res=>{
									resolve(res)
								})
							})
						}else{
							resolve(res[1])
						}
						
					}
				}
			)
			.catch(
				(response) => {
					reject(response)
				}
			)
		})
		return promise

};

优缺点分析:

提示:这里填写问题的分析:

另一个解决方案:写个带时间的存储方法,在存储token的时候,和后端设置同步的过期时间,在请求前拦截里,判断时间是否过期,再请求。
此方法的优点是少一次请求。
缺点是:需要在使用token的页面引用工具函数,时间还要设置统一,项目复杂的话不好管理,2.若请求时间较长,用户正好处于后端和前端交互的时间空隙。

上述的解决办法:缺点是多一次请求,需要先请求才能判断。
优点是,统一在此处处理,不需要别的工具函数


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值