vue后台如何刷新过期的token_Vue刷新token,判断token是否过期、失效的最简便的方法...

本文介绍了在Vue项目中如何处理token过期和刷新的问题。前端根据后端定义的特定状态码判断token是否过期,并在需要时自动更新token,确保用户能够无缝地继续使用应用。同时提供了请求和响应拦截器的实现示例,以及使用本地存储进行token管理的工具类。

刷新token和token是否过期的操作都是由后端实现,前端只负责根据code的不同状态来做不同的操作:

一、判断token是否过期、失效

举例:一般响应状态码 code :0,表示请求成功。①响应状态码 code:10010表示token过期 ②响应状态码 code:10011 表示token无效。这些状态码都由你自己和后端的同学一起定义。code等于10010和10011这两种状态都会跳转到登录页,重新进行登录并获取最新的token。

二、在一定时间内刷新token

为什么需要刷新token?因为出于安全性的考虑,一般是一天或几个小时更新token,看项目需要。

怎么实现?我和后端的同学是这么定义的,在发送任何一次请求时,如果需要更新token,响应体中后端的同学给我返回了token这个字段,token出现在了响应体中,说明这时候是需要刷新token的(其他非刷新token的请求时是没有token字段的),这时用localStorage保存最新token,自动覆盖掉原来旧的token,这样下次再调用新接口时用的就是最新的token了,这样用户也感知不到token更新的过程。

三、具体实现

/**

* 全局变量 和 设置 、配置等。。。*/import axios from'axios' //引入axios

import Storage from'@/assets/js/util/storage.js' //storage工具类,简单的封装

axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

/*请求拦截器*/axios.interceptors.request.use(function (config) { //每次请求时会从localStorage中获取token

let token= Storage.localGet('token')if(token) {

token= 'bearer' + ' ' + token.replace(/'|"/g, '') //把token加入到默认请求参数中

config.headers.common['Authorization'] =token

}returnconfig

},function(error) {returnPromise.reject(error)

})/*响应拦截器*/axios.interceptors.response.use(function (response) { //①10010 token过期(30天) ②10011 token无效

if (response.data.code === 10010 || response.data.code === 10011) {

Storage.localRemove('token') //删除已经失效或过期的token(不删除也可以,因为登录后覆盖)

router.replace({

path:'/login' //到登录页重新获取token

})

}else if (response.data.token) { //判断token是否存在,如果存在说明需要更新token

Storage.localSet('token', response.data.token) //覆盖原来的token(默认一天刷新一次)

}returnresponse

},function(error) {returnPromise.reject(error)

})

缓存工具类 Storage

var Storage ={//==================sessionsTorage设置缓存================

//设置缓存

sessionSet: function(name, data) {

sessionStorage.removeItem(name)

sessionStorage.setItem(name, JSON.stringify(data))

},//获取缓存

sessionGet: function(name) {returnJSON.parse(sessionStorage.getItem(name))

},//清除缓存

sessionRemove: function(name) {

sessionStorage.removeItem(name)

},//==================localStorage设置缓存==================

//设置缓存

localSet: function(name, data) {

localStorage.removeItem(name)

localStorage.setItem(name, JSON.stringify(data))

},//获取缓存

localGet: function(name) {returnJSON.parse(localStorage.getItem(name))

},//清除缓存

localRemove: function(name) {

localStorage.removeItem(name)

}

}

exportdefault Storage

### Vue 中 `window.TIMED_REFRESH_TOKEN_MILLISECOND_TIME` 的定义和作用 在 Vue 项目中,`window.TIMED_REFRESH_TOKEN_MILLISECOND_TIME` 是一个全局变量,用于设置刷新 token 的定时器间隔时间。这个变量通常被用来指定多久检查一次访问令牌 (`access_token`) 是否即将过期,并决定是否需要通过刷新令牌 (`refresh_token`) 获取新的访问令牌。 #### 定义方式 该常量可以在项目的入口文件或配置文件中定义: ```javascript // main.js 或其他初始化脚本 window.TIMED_REFRESH_TOKEN_MILLISECOND_TIME = 1800000; // 设置为30分钟(毫秒) ``` 此设定意味着每隔 30 分钟就会触发一次检测逻辑来判断当前的 `access_token` 是否接近其有效期结束[^4]。 #### 实现自动刷新 Token 流程 为了确保用户体验流畅,在实际应用开发过程中,可以通过如下代码片段实现基于上述定时器的时间戳校验功能: ```javascript function startTokenRefreshTimer() { const intervalId = setInterval(() => { let nowTimestamp = Date.now(); if (nowTimestamp >= window.ACCESS_TOKEN_EXPIRES_AT) { // ACCESS_TOKEN_EXPIRES_AT 需预先计算好 refreshToken().then((newAccessToken) => { console.log('Access token refreshed successfully'); // 更新本地存储中的 access_token 和对应的过期时间 localStorage.setItem('accessToken', newAccessToken); updateExpiresAt(newAccessToken.expires_in * 1000); // 转换为毫秒 // 继续保持轮询状态直到会话终止或其他条件满足停止 }).catch(error => { handleTokenError(error); clearInterval(intervalId); // 出错则清除计时器 }); } }, window.TIMED_REFRESH_TOKEN_MILLISECOND_TIME); return intervalId; } ``` 这段 JavaScript 代码展示了如何利用 `setInterval()` 方法创建周期性的回调函数执行环境,从而定期验证用户的认证状态并适时发起刷新请求[^3]。 #### 注意事项 - 应合理调整 `TIMED_REFRESH_TOKEN_MILLISECOND_TIME` 的值以平衡服务器负载与客户端响应速度之间的关系。 - 对于高并发场景下的 Web 应用程序来说,频繁地向后端发送刷新请求可能会造成不必要的压力;因此建议开发者依据具体业务需求优化这一参数。 - 如果应用程序处于不活跃状态下较长时间未操作,则可能没有必要持续运行此类后台任务,可考虑结合用户活动监测机制动态启停这些服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值