一、需求
此项目为小程序。小程序完成第一版token刷新设计思路是:根据接口调用返回的errorCode来判断当前用户的token和refreshToken是否过期。根据不同的errorCode,前端去调用接口完成token的刷新或者跳转到登录页面重新登录。
由于小程序的用户功能权限可以在后台管理系统中配置,但是小程序的用户权限变化后,没有办法通知到小程序去更新token或者提示用户重新登录。所以跟后端配合,需要前端增加一个定时调用刷新token接口的需求。比如:后端设置的token是10h过期,那前端就可以每隔5h去调用刷新接口去更新token。新的token接口会返回当前用户最新的权限。从而实现用户功能权限的更新。
二、实现思路
1、第一版代码(未增加定时刷新功能)接口封装如下
// 封装请求
const request = function(url, params) {
if (!url) {
console.log('请传入url......')
return
}
return new Promise((resolve, reject) => {
// to do
// 接口调用前 参数params封装
// 调用uniapp 请求接口
uni.request({
url: basePath + url, // 仅为示例,并非真实接口地址。
data: params.data,
header: {
'token': store.getters.getToken,
'content-type': params.contentType || 'application/x-www-form-urlencoded',
'refreshToken': store.getters.getRefreshToken,
},
method: params.method || 'POST',
}).then((uniData) => {
// uniData为一个数组
// 数组第一项为错误信息 即为 fail 回调
// 第二项为返回数据
const [err, uniRes] = uniData;
if (err) {
console.log('uni err-------------------:', err)
uni.showToast({
icon: 'none',
title: '服务异常,请稍后重试!'
})
return
}
const res = uniRes.data || {}
if (res.success) {
let resultData = res.data || {}
resolve(resultData)
} else {
const code = res.code
// to do
// 根据code处理异常
reject()
}
})
})
}
2. 实现定时刷新思路
2.1、记录用户信息刷新的时间(使用的时间戳),存vuex:timeOfUserInfo
在一切重新获取了用户权限信息(一定是token变更了)的接口处,记录当前的时间(记录的是用户本地的时间,也是用用户本地的时间去计算的时间差,当本地时间有误的时候,可能会出现接口没有调用的问题)。
2.2、判断是否调用refresh接口
接口A调用时,根据当前时间与timeOfUserInfo时间差,【1】如果超过3h,则先去调用refresh接口,同时挂起接口A.【2】如果没有超过3h,则直接调用
这里面存在2个问题