首页 > 其他分享 >uni-app token过期刷新与重新请求

uni-app token过期刷新与重新请求

时间:2023-11-23 11:55:05浏览次数:27  
标签:url app state promiseQueue token uni data store

import store from '@/store/index.js'

function loginOut() {
	uni.showToast({
		title: '登录失效,请重新登录',
		icon: 'none'
	})
	setTimeout(() => {
		uni.clearStorage()
		uni.reLaunch({
			url: '/pages/index/index'
		})
	}, 1500)
}
// 刷新token
async function RefreshTokenRQ(cb) {
	try {
		var refreshToken = uni.getStorageSync('RefreshToken')
		if (refreshToken) {
			const refreshTokenStatus = uni.getStorageSync("refreshTokenStatus");
			if (!refreshTokenStatus) {
				uni.setStorageSync('refreshTokenStatus', 'true');
				let result = await get(`https://xxxxxx/Login/Refresh?refreshToken=${refreshToken}`)
				if (result.data.code == 0) {
					uni.setStorageSync('MyToken', result.data.tokenResponse.access_token);
					uni.setStorageSync('RefreshToken', result.data.tokenResponse.refresh_token);
					uni.setStorageSync('loginTime', Math.ceil(new Date().getTime() / 1000));
					uni.removeStorageSync('refreshTokenStatus');
					cb && cb()
				} else {
					loginOut()
				}
			}
		} else {
			loginOut()
		}
	} catch (e) {}
}
const request = async (requestObj) => {
	let headers = [{
			'content-type': 'application/json'
		},
		{
			'content-type': 'application/x-www-form-urlencoded'
		},
		{
			'content-type': 'application/json',
			'Authorization': ''
		},
	]
	try {
		var value = wx.getStorageSync('MyToken')
		if (value) {
			headers[2]['Authorization'] = 'Bearer ' + value
		} else {}
	} catch (e) {}

	return new Promise((resolve, reject) => {
		uni.request({
			// url: baseUrl + url, 
			url: requestObj.url,
			method: requestObj.method || 'GET',
			header: headers[requestObj.header],
			data: requestObj.data || {},
			success: (res) => {
				let promiseQueue = store.state.promiseQueue;
				if (res.statusCode === 200) {
					if (requestObj.url.indexOf('/Login') > -1) {
						uni.setStorage({
							key: 'loginTime',
							data: Math.ceil(new Date().getTime() / 1000)
						})
					}
					if (requestObj.resolve) {
						。
						requestObj.resolve(res);
						let promiseQueueItem = promiseQueue.shift();
						if (store.state.exeQueue) {
							store.state.exeQueue = false;
							while (promiseQueueItem) {
								request(promiseQueueItem);
								promiseQueueItem = promiseQueue.shift();
								store.state.promiseQueue = promiseQueue;
							}
							if (!promiseQueueItem) {
								store.state.exeQueue = true;
								store.state.needBeginLogin = true;
							}
						}
					} else {
						resolve(res);
					}
				} else if (res.statusCode == 401) {
					try {
						var refreshToken = uni.getStorageSync('RefreshToken')
						if (refreshToken) {
							requestObj.resolve = resolve;
							promiseQueue.push(
								requestObj); //请求失败了,把该请求放到promise队列,等待更新token后重新调用。
							if (!store.state.needBeginLogin) {
								return;
							}
							//防止重复刷新token。
							store.state.needBeginLogin = false;
							RefreshTokenRQ(() => { //获取完token以后执行回调
								//重新登陆以后调用一次队列中的promise;并设置队列为可循环状态。
								let promiseQueueItem = promiseQueue.shift();
								if (promiseQueueItem) {
									store.state.exeQueue = true;
									request(promiseQueueItem);
									store.state.promiseQueue = promiseQueue;
								}
							}, true)
						} else {
							loginOut()
						}
					} catch (e) {}
				}
			},
			fail: (err) => {
				uni.showToast({
					title: '请求失败',
					icon: 'none'
				})
				reject(err)
			}
		})
	})
}

export function get(url, data, header = 2, method = 'GET') {
	return request({
		url,
		data,
		header
	})
}

export function post(url, data, header = 2, method = 'POST') {
	return request({
		url,
		data,
		header,
		method
	})
}

export function put(url, data, header = 2, method = 'PUT') {
	return request({
		url,
		data,
		header,
		method
	})
}

export function del(url, data, header = 2, method = 'DELETE') {
	return request({
		url,
		data,
		header,
		method
	})
}

标签:url,app,state,promiseQueue,token,uni,data,store
From: https://www.cnblogs.com/Cxymds/p/17851253.html

相关文章

  • UniApp打包教程:使用HBuilder X和AppUploader完成原生App云打包和上架指南"
    ​目录 uniapp进行打包使用上架工具appuplode进行发包1.登录appuploder软件     2.登陆开发者AppStore后台 uniapp进行打包在HBuilderX编辑器中打开需要打包的项目,然后点击上面菜单栏中发行=>原生App-云打包,对以下弹出的弹窗进行内容填写   ​......
  • JWT生成的token——中间部分Payload的坑
     JWT进行token认证应该都用过,标准的加密(Base64编码)后的token是这样的三段式的:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWQiOiIxMjM0NTY3ODkwIiwiZXhwIjoxNjA1MDAxNzQyLCJpYXQiOjE2MDQ5OTQ1NDIsImp0aSI6IjU5YjI2NDEzLTE4MjMtNDVlZS1iZTI1LTA5M2ZjMjlhMmYzOCJ9.FMpVju......
  • Unity3d中使用sketchup 3dwarehouse模型
    1、选择菜单【文件】【导出】【三维模型】,打开导出对话框。选择保存类型为“*.fbx”。2、进行选项配置,“几何图形”类别勾选【导出两边的平面】【分离不连接的平面】,“材料”类别勾选【导出纹理映射】,“比例”类别中勾选【切换yz坐标(Y向上)】,单位选择【米】点击【确定】按钮。3......
  • Windows平台Unity下实现camera场景推送RTMP|轻量级RTSP服务|实时录像
    技术背景我们在对接Unity平台camera场景采集的时候,除了常规的RTMP推送、录像外,还有一些开发者,需要能实现轻量级RTSP服务,对外提供个拉流的RTSPURL。目前我们在Windows平台Unity下数据源可采集到以下部分:采集Unitycamera场景;采集摄像头;采集屏幕;采集Unity声音;采集麦克风;采集扬声器;Un......
  • This application requires a java runtime environment 1.6.0
    解决Thisapplicationrequiresajavaruntimeenvironment1.6.0问题描述在安装ptolemyII的时候,提示我没有java运行环境。但是实际上作为jvm的hn,我电脑上就有各种版本的jdk,什么环境变量、java-version都保证没问题,别的软件也能运行,就它不行问题解决jdk是通过解压而后设......
  • 使用 Android Studio 开发一款弹钢琴app
    A.项目描述本项目主要实现了【钢琴键盘的模拟】、【弹奏引导】以及【乐曲库】等功能。钢琴键盘模拟:提供全尺寸键盘,并且根据用户的喜好来调整键盘的颜色样式。弹奏引导:用户可以根据键盘上的提示符号......
  • uniapp底层跨端原理
    uniapp底层跨端原理-代码编写:开发者使用Vue.js框架编写uniapp的代码,包括页面结构、样式和逻辑等。-编译过程:在编译过程中,uniapp会将Vue.js的代码转换为各个平台所需的代码。这一转换过程由uniapp的编译器完成。-平台特定代码生成:根据不同平台的特性和要求,uniapp的编译器......
  • AppLink结合金蝶云星空作订单信息同步流程
    此次通过AppLink,根据请求数据金蝶云星空做销售订单信息同步拉取在获取订单信息前需要得到金蝶云星空授权,详细授权步骤可查看:金蝶云星空授权指南根据请求数据在金蝶云星空保存销售订单当webhook接收到数据时触发流程步骤1:根据webhook的请求数据构建金蝶云星空表单查询的过滤条件步骤......
  • 2023-11-22 Invariant Violation: [app.model] namespace should be unique ==》模块
     如上图,报错原因:存在多个名为demoDataSource的模块名称导致报错解决方案:修改模块名称即可,把demoDataSource改为demoDataSource2就不会报错了扩展:该问题是由rudex引起的,redex要求数据模型(models)命名(namespace)必须不同,否则在注入该数据模型时就会报错......
  • Unity 低功耗玉石
    前言曾使用过UE5的substrate系统基于BSDF实现过玉石材质,效果雀氏nice但消耗太高了!因此本篇基于Unity介绍如何模拟透射来实现一个低功耗的玉石材质效果如下本篇同步发布于http://chenglixue.top/index.php/unity/90/总体框架模拟透射光思路因为透射现象是一种光打在物......