前端实现双token的无感刷新技术方案

news/2024/5/11 18:12:50

背景介绍

在一些项目中,登录机制是双token机制,即有一个短期token(一般设置为30分钟过期),还有一个刷新token(过期时间比较长,可能1天或多天),用于去重新获取新的短期token。

前端的无感刷新技术实现原理主要是,通过axios的拦截器,在响应拦截里获取到后端接口的返回码,根据返回码判断短期token是否过期。

若短期token过期,则去请求判断刷新token是否过期的接口,如果刷新token过期,则返回登陆页面。若刷新token还有效,则用刷新token重新请求接口,刷新获取新的短期token,再去请求刚才的接口。

axios封装案例

import axios from 'axios'// 创建实例时配置默认值
let url = import.meta.env.VITE_BASE_API;let flag = false // 设置开关,保证一次只能请求一次刷新token,防止客户多次操作,多次请求
let subSequest = []// 把过期请求添加在数组中
function addRequest(request) {console.log('把过期请求添加在数组中')subSequest.push(request)
}// 重新调用过期请求列表
function retryRequest() {console.log('重新调用过期请求列表')subSequest.forEach((request) => request())subSequest = []
}// 刷新token
function refreshToken() {if(!flag) {console.log('刷新token')flag = true;// 获取刷新tokenlet r_tk = getRefreshToken()if(r_tk) {// 判断刷新token是否过期refresh().then(res => {// 刷新token失效,退出登录if(res.code === 4006) {flag = false// 移除刷新tokenremoveRefreshToken()} else if(res.code === 2000) {// 存储新的主tokensetAccessToken(res.data.accessToken)// 存储新的刷新tokensetRefreshToken(res.data.refreshToken)flag = false// 重新发送请求retryRequest()}})}}
}// 请求配置
const instance = axios.create({baseURL: `${url}`, // 设置axios全局api URL// baseURL: 'http://30.118.139.106/stg/ai/aigcv2',timeout: 60000, // 默认值是 `0` (永不超时)// `withCredentials` 表示跨域请求时是否需要使用凭证withCredentials: true, // default
});// 添加请求拦截器
instance.interceptors.request.use(function (config) {// 在发送请求之前做些什么config.headers['X-Request-Id'] = getUUID();return config;
}, function (error) {// 对请求错误做些什么return Promise.reject(error);
});// 添加响应拦截器
instance.interceptors.response.use((response) => {// 2xx 范围内的状态码都会触发该函数。const { status, config } = responsereturn new Promise((resolve, reject) => {if (status === 200) {const code = parseInt(response.data.code)if (code === 200) {resolve(response.data)}else if (code === 402) {// toLogin('用户token过期请重新登录~')// 移除失效的主tokenlocalStorage.removeItem('token')// 把过期请求存储起来,用于请求到新的刷新tokenaddRequest(() => resolve(instance(config)))// 用刷新token去请求新的主tokenrefreshToken()}else {resolve(response.data)}}else {resolve(response.data)Message.error(response.data.message || response.data.responseMsg);}})},
(error) => {if (error) {// 登录态失效const { response: { status, data } } = error}return Promise.reject(error);
});export default instance;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/10632.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Vue3 ElementPlus-table组件(合计)合并列

在使用ElementPlus的table组件的时候&#xff0c;我们通常会处理合计&#xff0c;当遇到合计行需要合并列的时候&#xff0c;可以这样做。 核心就是获取标签&#xff0c;对标签的CSS样式进行设置&#xff0c;以达到合并单元格的效果。 Template <el-tablemax-height"ca…

浏览器与服务器通信过程(HTTP协议)

目录 1 概念 2 常见的 web 服务器有 3 浏览器与服务器通信过程 3.1 DNS 3.2 URL 4 HTTP请求方法和应答状态码 4.1 HTTP请求报文段实例 4.2 HTTP请求方法 5 HTTP应答报头和应答状态 5.1 HTTP的应答报头结构 5.2 HTTP的应答状态 1 概念 浏览器与 web 服务器在应用层通…

开源大数据集群部署(十五)Zookeeper集群部署

作者&#xff1a;櫰木 1、集群规划 主机版本角色系统用户hd1.dtstack.com3.7.1followerzookeeperhd2.dtstack.com3.7.1leaderzookeeperhd3.dtstack.com3.7.1followerzookeeper 2、zookeeper kerberos主体创建 在生产中zk服务端和客户端票据可以设置成不通名称或相同名称&am…

华为数通方向HCIP-DataCom H12-821题库(多选题:161-180)

第161题 以下关于IPv6优势的描述,正确的是哪些项? A、底层自身携带安全特性 B、加入了对自动配置地址的支持,能够无状态自动配置地址 C、路由表相比IPv4会更大,寻址更加精确 D、头部格式灵活,具有多个扩展头 【参考答案】ABD 【答案解析】 第162题 在OSPF视图下使用Filt…

web的部署

首先&#xff0c;我们鼠标右击此电脑&#xff0c;管理&#xff0c;添加角色和功能 默认下一步&#xff0c; 默认下一步&#xff0c; 默认下一步&#xff0c; 勾选web&#xff0c;点击下一步&#xff0c; 点击下一步&#xff0c; 默认下一步&#xff0c; 勾选所需功能&#xff0…

宠物小精灵之收服

题目描述 宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事。 一天&#xff0c;小智和皮卡丘来到了小精灵狩猎场&#xff0c;里面有很多珍贵的野生宠物小精灵。小智也想收服其中的一些小精灵。然而&#xff0c;野生的小精灵并不那么容易被收服。对于每一个野生小精灵而…