当前位置: 首页 > news >正文

axios无感刷新token

  1. html代码
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link href="https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.14/theme-chalk/index.css" rel="stylesheet">
</head><body><div><button class="el-button el-button--primary">获取token</button><button class="el-button el-button--primary">测试</button><button class="el-button el-button--primary">刷新</button></div><script src="https://cdn.bootcdn.net/ajax/libs/axios/1.9.0/axios.js"></script><script>const getToken = () => {return localStorage.getItem('token');}const setToken = (token) => {localStorage.setItem('token', token);}axios.defaults.baseURL = 'http://localhost:18565';axios.interceptors.request.use(config => {config.headers.authorization = getToken();return config;}, error => {return Promise.reject(error);});let isRefreshing = false;let queue = [];axios.interceptors.response.use(response => {return response.data;}, error => {if ([403, 401].includes(error.status)) {if (!isRefreshing) {isRefreshing = true;return axios.request({ url: '/test/api/refresh-token', method: 'post' }).then(res => {setToken(res.data.token);queue.forEach(callback => callback());queue = [];return axios.request(error.config);}).finally(() => {isRefreshing = false;})}return new Promise((resolve, reject) => {queue.push(() => {axios.request(error.config)});});}return Promise.reject(error);});const test1 = document.querySelector('.el-button--primary:nth-child(1)');const test2 = document.querySelector('.el-button--primary:nth-child(2)');const refresh = document.querySelector('.el-button--primary:nth-child(3)');test1.addEventListener('click', () => {axios.request({url: '/test/api/get-token',method: 'get',}).then(res => {localStorage.clear();console.log(res.data.token, '---------get-token');setToken(res.data.token);});});test2.addEventListener('click', () => {axios.request({url: '/test/api/protected',method: 'get',headers: {authorization: getToken()}}).then(res => {console.log(res, '---------protected');});});refresh.addEventListener('click', () => {axios.request({url: '/test/api/refresh-token',method: 'post',}).then(res => {console.log(res, '---------refresh-token');});});</script>
</body></html>
  1. server端代码,可以使用mock进行模拟
const expireTime = 10 * 1000;
// 生成简单的token字符串
function generateToken() {// 生成一个随机字符串作为tokenreturn (Date.now() + expireTime).toString();
}// 获取初始token接口
// 前端首次调用此接口获取token
router.get('/api/get-token', (req, res) => {const token = generateToken();res.json({code: 200,msg: 'token获取成功',data: {token,},});
});// 受保护的接口,调用次数超过限制就返回token过期
router.get('/api/protected', (req, res) => {// 从请求头获取token,前端需在请求头加authorization: tokenconst token = req.headers['authorization'];let isExpire = parseInt(token) >= Date.now();// 检查token是否存在且有效if (!token || !isExpire) {// 没有token或token无效return res.status(401).json({code: 401, msg: 'token已过期,请刷新token'});}res.json({code: 200,msg: '调用成功',data: {msg: '调用成功',},});
});// 刷新token接口,返回新token并重置计数
router.post('/api/refresh-token', async (req, res) => {await sleep(5 * 1000);const newToken = generateToken();res.json({code: 200,msg: 'token刷新成功',data: {token: newToken,},});
});
http://www.dtcms.com/a/269187.html

相关文章:

  • 万物智联时代启航:鸿蒙OS重塑全场景开发新生态
  • Android kotlin中 Channel 和 Flow 的区别和选择
  • 《Effective Python》第十二章 数据结构与算法——当精度至关重要时使用 decimal
  • 【R语言】Can‘t subset elements that don‘t exist.
  • 学习日记-spring-day42-7.7
  • Java --接口--内部类分析
  • [学习] C语言数学库函数背后的故事:`double erf(double x)`
  • qiankun 微前端框架子应用间通信方法详解
  • 一份多光谱数据分析
  • Spring MVC HandlerInterceptor 拦截请求及响应体
  • [netty5: LifecycleTracer ResourceSupport]-源码分析
  • idea启动后闪一下,自动转为后台运行
  • 全国产化行业自主无人机智能处理单元-AI飞控+通信一体化模块SkyCore-I
  • VmWare 安装 mac 虚拟机
  • 量子计算+AI芯片:光子计算如何重构神经网络硬件生态
  • C++ 定位 New 表达式深度解析与实战教程
  • 如果让计算机理解人类语言- Word2Vec(Word to Vector,2013)
  • 系统学习Python——并发模型和异步编程:基础知识
  • 无需公网IP的文件交互:FileCodeBox容器化部署技术解析
  • AI编程才刚起步,对成熟的软件工程师并未带来质变
  • Java 内存分析工具 Arthas
  • Cookie的HttpOnly属性:作用、配置与前后端分工
  • 用U盘启动制作centos系统最常见报错,系统卡住无法继续问题(手把手)
  • 用于构建多模态情绪识别与推理(MERR)数据集的自动化工具
  • 2025年全国青少年信息素养大赛图形化(Scratch)编程小学高年级组初赛样题答案+解析
  • 【Netty高级】Netty的技术内幕
  • 设计模式—专栏简介
  • Baumer工业相机堡盟工业相机如何通过DeepOCR模型识别判断数值和字符串的范围和相似度(C#)
  • Spring AOP 设计解密:代理对象生成、拦截器链调度与注解适配全流程源码解析
  • 學習網頁製作