vue token过期后自动刷新token

article/2025/6/29 6:41:32

在系统登录后,后端返回一个token,和refreshToken。每次接口请求的时候都会携带这个token,但是这个token一般是有过期时间的,假设过期时间为半小时,你半小时内没有调接口。半小时后你再调接口,会报401错误,代表token过期,这个时候前端有两种解决方案,第一种也就是退出登录,让用户重新登录,这种比较简单。但是我们的经理不希望用户再次登录,而是希望这个token能自动更新,我就稍微的研究了一下,发现可行,所以记录到此,方便日后查看

自动刷新token的原理就是:

在axios响应拦截器中判断http状态是否是401,如果是,则拿着refreshToken去调接口,接口会返回新的token和refreshToken,将新token和refreshToken在vuex中从新赋值。然后继续调刚才报401的那个接口,这时候携带新token去请求就可以了

request.js

import axios from 'axios'
import store from '@/store'
import storage from 'store'
import notification from 'ant-design-vue/es/notification'
import { message } from 'ant-design-vue'
import { VueAxios } from './axios'
import { ACCESS_TOKEN } from '@/store/mutation-types'// 创建 axios 实例
const request = axios.create({// API 请求的默认前缀baseURL: process.env.VUE_APP_API_BASE_URL,timeout: 6000 // 请求超时时间
})const mytoken = `Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJJRCI6IjI5MTYzOTA1NzgyNzc1MTkzNjAiLCJOQU1FIjoiZHVhbnJvbmd5YW8iLCJuYmYiOjE2NDE5NzkwNzcsImV4cCI6MTY0MTk4MDg3NywiaXNzIjoiaHR0cDovLzM5LjEwMy4yMTUuNTE6MzAwMDQiLCJhdWQiOiJLYXlUdW5lIn0.b6Ps4BqI4BH6qDYbxTVGo72ctoUxL-9G_woXx_askrA`// 异常拦截处理器
const errorHandler = (error) => {// console.log(error.response);if(error.message == 'Network Error') {message.error('系统异常')}if (error.response) {const data = error.response.data// 从 localstorage 获取 tokenconst token = storage.get(ACCESS_TOKEN)if (error.response.status === 403) {notification.error({message: 'Forbidden',description: data.message})}// 判断http状态是否是401if (error.response.status === 401) {// 调接口,刷新tokenstore.dispatch('RefreshToken').then(() => {// 再发请求return request(error.config)}).catch((err)=>{message.error('系统异常')})}}return Promise.reject(error)
}// request interceptor
request.interceptors.request.use(config => {const accessToken = store.getters.tokenconst token = storage.get(ACCESS_TOKEN)// 如果 token 存在// 让每个请求携带自定义 token 请根据实际情况自行修改if (token) {config.headers['Access-Token'] = token}config.headers['Authorization'] = `Bearer ${accessToken}`return config
}, errorHandler)// response interceptor
request.interceptors.response.use((response) => {if(response.data instanceof Blob) {return response}return response.data
}, errorHandler)const installer = {vm: {},install (Vue) {Vue.use(VueAxios, request)}
}export default requestexport {installer as VueAxios,request as axios
}

user.js

import storage from 'store'
// import { login, getInfo, logout } from '@/api/login'
import { getInfo, logout, refreshTokenFn } from '@/api/login'
import { ACCESS_TOKEN, REFRESH_TOKIN } from '@/store/mutation-types'
import { welcome } from '@/utils/util'const user = {state: {token: '',refreshToken: '',name: '',welcome: '',avatar: '',roles: [],info: {},systemId: ''},mutations: {SET_TOKEN: (state, token) => {state.token = token},SET_RETOKEN: (state, refreshToken) => {state.refreshToken = refreshToken},SET_NAME: (state, { name, welcome }) => {state.name = namestate.welcome = welcome},SET_AVATAR: (state, avatar) => {state.avatar = avatar},SET_ROLES: (state, roles) => {state.roles = roles},SET_INFO: (state, info) => {state.info = info},SET_SYSTEMID: (state, data) => {state.systemId = data}},actions: {// 登录Login ({ commit }, userInfo) {return new Promise((resolve, reject) => {if (!userInfo.accessToken) {reject(new Error('403'))}storage.set(ACCESS_TOKEN, userInfo.accessToken, 7 * 24 * 60 * 60 * 1000)storage.set(REFRESH_TOKIN, userInfo.refreshToken, 7 * 24 * 60 * 60 * 1000)commit('SET_TOKEN', userInfo.accessToken)commit('SET_RETOKEN', userInfo.refreshToken)resolve()// login(userInfo).then(response => {//   const result = response.result//   storage.set(ACCESS_TOKEN, result.token, 7 * 24 * 60 * 60 * 1000)//   commit('SET_TOKEN', result.token)//   resolve()// }).catch(error => {//   reject(error)// })})},// 获取用户信息GetInfo ({ commit }) {return new Promise((resolve, reject) => {getInfo().then(response => {const result = response.resultconsole.log('result', result)if (result.role && result.role.permissions.length > 0) {const role = result.rolerole.permissions = result.role.permissionsrole.permissions.map(per => {if (per.actionEntitySet != null && per.actionEntitySet.length > 0) {const action = per.actionEntitySet.map(action => { return action.action })per.actionList = action}})role.permissionList = role.permissions.map(permission => { return permission.permissionId })commit('SET_ROLES', result.role)commit('SET_INFO', result)} else {reject(new Error('getInfo: roles must be a non-null array !'))}commit('SET_NAME', { name: result.name, welcome: welcome() })commit('SET_AVATAR', result.avatar)resolve(response)}).catch(error => {reject(error)})})},// 登出Logout ({ commit, state }) {return new Promise((resolve) => {logout(state.token).then(() => {commit('SET_TOKEN', '')commit('SET_ROLES', [])storage.remove(ACCESS_TOKEN)resolve()}).catch((err) => {console.log('logout fail:', err)// resolve()}).finally(() => {})})},// 刷新tokenRefreshToken({commit, state}) {return new Promise((resolve, reject)=>{const refreshToken = `${state.refreshToken}`refreshTokenFn({refreshToken}).then((res)=>{if(res.code == 1) {commit('SET_TOKEN', res.data.accessToken)commit('SET_RETOKEN', res.data.refreshToken)resolve()}else {reject()}}).catch((err) => {reject(err)}).finally(() => {})})}}
}export default user

refreshTokenFn函数

/*** 刷新token* @param {*} parameter * @returns */
export function refreshTokenFn (parameter) {return request({// url: `${userApi.RefreshToken}?refreshToken=${parameter.refreshToken}`,url: `${userApi.RefreshToken}`,method: 'post',headers: { 'content-type': 'application/x-www-form-urlencoded' },data: qs.stringify(parameter),})
}

 


http://chatgpt.dhexx.cn/article/NtPrEn4E.shtml

相关文章

JAVA开发(token过期续期)

一、需求背景: 在使用token进行登录的过程中,如果token过期了,需要重新输入用户名和密码登录,这种体验肯定是不好的,因为如果一直在使用系统,系统应该一直能够保持登录状态,而不是用着用着就突然…

token系统讲解及过期处理

token系统讲解及过期处理 1. token是什么?用来做什么2. token存储在哪?过期了怎么办?3. 请求拦截与响应拦截执行时机(面试重点)4. 解决token过期方案一: 重新登录5. 方案二:使用 refresh_token…

前端token知识梳理:token如何存储?token过期如何处理?如何无感知刷新token?

在前后端是以token(令牌)的形式交互的,既然是token,是有过期时间的(为了接口数据的安全, 服务器的token不会设置太久,根据需要一般是1-7天),没有一个token是永久的&…

处理token过期的问题,无感知刷新token

401错误的场景 有如下两种情况会出现401错误: 未登陆用户做一些需要权限才能做的操作,代码会报出401错误。这种情况下,应该让用户回到登陆页。登录用户的token过期了 整体目标是:通过axios响应拦截器来处理401问题。 理解toke…

前端怎么判断token过期或无token问题

有如下两种情况会出现401错误: 未登陆用户做一些需要权限才能做的操作(例如:关注作者),代码会报出401错误。这种情况下,应该让用户回到登陆页。登录用户的token过期了 ( token会有有效期(具体是…

react中 token过期,如何处理?

思路:首先在request.js中的响应拦截器这块写token失效的提示,然后再让它进行清空token和路由跳转 第一步:在request.js文件中 导入 import store from /store import { logout } from /store/actions/login 第二步:在响应拦截器…

token 过期解决

vue如何在token过期之后跳转到登录页面,且不影响其他无需携带token的接口数据访问 事情是这样的,最近做了一个类似于商城的项目。本来测试是没有问题的,后来过了大概三四天的时间没有在浏览器中打开过,再打开以后,在未…

前端token知识梳理:token如何存储?token过期如何处理?如何无感刷新token?

在前后端是以token的形式交互,既然是token,那么肯定有它的过期时间(为了接口数据的安全,服务器的token一般不会设置太长,根据需要一般是1-7天的样子),没有一个token是永久的,永久的token就相当于一串永久的…

token过期怎么办 无感刷新token

(1)可以通过响应拦截器或者全局前置守卫强制跳转登录页 // 全局前置守卫 router.beforeEach((to, from) > {let token sessionStorage.token;if (token) {return true} else {return { name: Login, query: { redirect: to.fullPath } };} }) // 添…

关于 Token 过期问题的两种解决方案

对于token过期,我们有两种方案: 方案一:当我们操作某个需要token作为请求头的接口时,返回的数据错误error.response.status 401,说明我们的token已经过期了。 我们希望当响应返回的数据是401身份过期时,让…

Latex 符号(Symbols)

Latex符号广泛用于数百个类别的不同主题中。对于数学或其他学科中使用的每个符号,将使用相应的命令。本主题将为您提供有关符号的详细概念和说明,以及以哪种方式可以使用所有符号。 使用标准文本,您可以使用任何符号。这种方法不仅节省了精力…

Latex特殊符号汇集

原文链接:https://blog.csdn.net/ying_xu/article/details/51240291 这段时间用Latex很多,常常需要查阅相关特殊的符号,这里做一个整理,也方便大家查阅。 摘自:《一份不太简短的LATEX2介绍》或112分钟学会LATEX2 原…

(13.1)Latex符号、公式及伪代码

文章目录 一、符号大全和小工具1、符号大全2、小工具(1)图片转Latex(2)在线Latex公式编辑 二、公式格式三、伪代码四、注意事项1、符号宏包2、颜色宏包3、换段未缩进4、单引号和双引号 一、符号大全和小工具 1、符号大全 Latex …

LaTex常见数学符号与示例

在写文档或者博客过程中,数学公式是最难表示的,比如根号,下标号,分号,还有绝对值的表示,复杂一些的比如矩阵的表示,积分的表示,求和公式。 LaTex提供了丰富的表示方法,用…

Latex数学符号对应表

Latex数学符号对应表 - 叮叮当当sunny - 博客园 目录 1. 希腊字母2. 运算符符号3. 关系符号4. 箭头符号5. 括号符号6. 其他符号7. MATLAB 回到顶部 1. 希腊字母 字母实现字母实现αα\alphaAA\Alphaββ\betaBB\Betaγγ\gammaΓΓ\Gammaδδ\deltaΔΔ\Deltaϵϵ\epsilon…

LateX各种命令符号

函数、符号及特殊字符 声调 语法效果语法效果语法效果\bar{x}\acute{\eta}\check{\alpha}\grave{\eta}\breve{a}\ddot{y}\dot{x}\hat{\alpha}\tilde{\iota} 函数 语法效果语法效果语法效果\sin\theta\cos\theta\tan\theta\arcsin\frac{L}{r}\arccos\frac{T}{r}\arctan\frac{L}{…

Latex特殊符号大全(高清)

Latex符号大全 转载内容供自己阅读 原文:Latex特殊符号大全(高清)

Latex常见符号对照表

摘要: Latex可以很方便的利用命令来生成各式各样的特殊符号. 这里根据官方的文档将这些常见符号列出, 以备查用. B.1 希伯来和希腊字母(Hebrew and Greek letters) 希伯来语: 希腊语: 数学表达式中常常用下面的这些符号, 分小写/大写 B.2 二元关系符(Binary relations) …

LaTeX最全的数学符号大全(更新中…… )

文章目录 1 基本字符常用数集字母字母加标表示希腊字母 2 四则运算运算符号等号比较范围 3 常用函数4 离散数学运算符5 集合集合表示集合操作集合关系 最后更新于2020/12/02 1 基本字符 常用数集字母 符号 LaTeX \LaTeX LATE​X符号说明示例 N \mathbb{N} N\mathbb{N}自然数集…