在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前言: 最近在做需求的时候,涉及到登录 前端:后端,你能不能把token 过期时间设置的长一点。 后端:可以,但是那样做不安全,你可以用更好的方法。 前端:什么方法? 后端:给你刷新token的接口,定时去刷新token 前端:好,让我思考一下 1、需求当 方法一后端返回过期时间,前端判断 缺点:需要后端额外提供一个 方法二写个定时器,定时刷新 缺点:浪费资源,消耗性能,不建议采用。 方法三在响应拦截器中拦截,判断 2、实现
import axios from 'axios' service.interceptors.response.use( response => { if (response.data.code === 409) { return refreshToken({ refreshToken: localStorage.getItem('refreshToken'), token: getToken() }).then(res => { const { token } = res.data setToken(token) response.headers.Authorization = `${token}` }).catch(err => { removeToken() router.push('/login') return Promise.reject(err) }) } return response && response.data }, (error) => { Message.error(error.response.data.msg) return Promise.reject(error) }) 3、问题解决问题一:如何防止多次刷新token我们通过一个变量 import axios from 'axios' service.interceptors.response.use( response => { if (response.data.code === 409) { if (!isRefreshing) { isRefreshing = true return refreshToken({ refreshToken: localStorage.getItem('refreshToken'), token: getToken() }).then(res => { const { token } = res.data setToken(token) response.headers.Authorization = `${token}` }).catch(err => { removeToken() router.push('/login') return Promise.reject(err) }).finally(() => { isRefreshing = false }) } } return response && response.data }, (error) => { Message.error(error.response.data.msg) return Promise.reject(error) }) 问题二:同时发起两个或者两个以上的请求时,其他接口怎么解决当第二个过期的请求进来, 最终代码: import axios from 'axios' // 是否正在刷新的标记 let isRefreshing = false //重试队列 let requests = [] service.interceptors.response.use( response => { //约定code 409 token 过期 if (response.data.code === 409) { if (!isRefreshing) { isRefreshing = true //调用刷新token的接口 return refreshToken({ refreshToken: localStorage.getItem('refreshToken'), token: getToken() }).then(res => { const { token } = res.data // 替换token setToken(token) response.headers.Authorization = `${token}` // token 刷新后将数组的方法重新执行 requests.forEach((cb) => cb(token)) requests = [] // 重新请求完清空 return service(response.config) }).catch(err => { //跳到登录页 removeToken() router.push('/login') return Promise.reject(err) }).finally(() => { isRefreshing = false }) } else { // 返回未执行 resolve 的 Promise return new Promise(resolve => { // 用函数形式将 resolve 存入,等待刷新后再执行 requests.push(token => { response.headers.Authorization = `${token}` resolve(service(response.config)) }) }) } } return response && response.data }, (error) => { Message.error(error.response.data.msg) return Promise.reject(error) } ) 到此这篇关于如何实现无感刷新token的文章就介绍到这了,更多相关实现无感刷新token内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论