vue2中实现token的无感刷新
后端配置
- 设置Token过期时间:在后端(如服务器或网关)配置access_token和refresh_token的过期时间。通常,access_token的过期时间较短,而refresh_token的过期时间较长。
- 提供刷新Token接口:后端需要提供一个接口,用于接收前端发送的refresh_token并返回新的access_token和refresh_token
前端实现
1. 安装Axios:首先,确保在Vue项目中安装了Axios库,用于发送HTTP请求。
npm install axios
2. 创建Axios实例:在Vue项目中创建一个Axios实例,并配置基础URL等参数。
import axios from 'axios';const instance = axios.create({baseURL: '/api', // 后端接口的基础URLtimeout: 10000, // 请求超时时间
});
3. 添加请求拦截器:在Axios实例中添加请求拦截器,用于在每次请求前判断是否需要添加token。
instance.interceptors.request.use(config => {const accessToken = localStorage.getItem('access_token'); // 从本地存储中获取access_tokenif (accessToken) {config.headers.Authorization = `Bearer ${accessToken}`; // 设置请求头中的Authorization字段}return config;},error => {return Promise.reject(error);}
);
4. 添加响应拦截器:在Axios实例中添加响应拦截器,用于处理后端返回的响应数据。当access_token过期时(通常返回401状态码),自动使用refresh_token刷新access_token,并重新发送原始请求。
let isRefreshing = false; // 标记是否正在刷新token
let pendingRequests = []; // 存储待重发的请求instance.interceptors.response.use(async response => {if (response.data && response.data.code === 401) {// access_token过期,尝试使用refresh_token刷新if (!isRefreshing) {isRefreshing = true;try {const refreshToken = localStorage.getItem('refresh_token'); // 从本地存储中获取refresh_tokenconst res = await axios.post('/api/refresh-token', { refresh_token: refreshToken }); // 发送刷新token请求const newAccessToken = res.data.access_token; // 获取新的access_tokenlocalStorage.setItem('access_token', newAccessToken); // 存储新的access_token到本地存储// 重发待重发的请求pendingRequests.forEach(({ config, resolve }) => {config.headers.Authorization = `Bearer ${newAccessToken}`; // 更新请求头中的Authorization字段resolve(instance(config)); // 重新发送请求});pendingRequests = []; // 清空待重发的请求队列} catch (error) {// 刷新token失败,处理错误(如跳转到登录页面)console.error('Failed to refresh token', error);// 根据项目需求,可能需要进行其他错误处理,如清除本地存储、重置路由等} finally {isRefreshing = false; // 无论成功还是失败,都标记为不再刷新token}// 注意:由于此时已经刷新了token并重发了请求,因此不需要再返回原始的401响应给调用者// 可以选择返回一个特定的响应或者抛出一个错误,根据实际需求决定return Promise.reject(new Error('Token refreshed and request retried'));} else {// 如果已经在刷新token,则将当前请求加入待重发的请求队列return new Promise((resolve) => {pendingRequests.push({ config, resolve });});}}return response;},error => {return Promise.reject(error);}
);
5. 使用Axios实例发送请求:在Vue组件或Vuex等地方使用创建的Axios实例发送请求,即可实现token的无感刷新。
// 在Vue组件中发送请求
instance.get('/api/some-endpoint').then(response => {// 处理响应数据console.log(response.data);}).catch(error => {// 处理请求错误(如网络错误、服务器错误等)console.error('Request error', error);});
通过以上步骤,您就可以在Vue 2项目中实现token的无感刷新了。请注意,这只是一个基本的实现示例,具体实现可能需要根据项目的实际需求进行调整和优化。
相关文章:
vue2中实现token的无感刷新
后端配置 设置Token过期时间:在后端(如服务器或网关)配置access_token和refresh_token的过期时间。通常,access_token的过期时间较短,而refresh_token的过期时间较长。提供刷新Token接口:后端需要提供一个…...
无需Photoshop即可在线裁剪和调整图像大小的工具
Bitmind是一个灵活且易于使用的批量图像本地化处理器,经过抓包看,这个工具在浏览器本地运行,不会上传图片到服务器,所以安全性完全有保证。 它可以将图像调整到任何特定尺寸,并在必要时按比例裁剪。 这是一个在线工具…...
云安全之法律和合规
0x00 前言 本文主要内容是从法律,合同,电子举证,以及合规和审计这五个部分来记录一下相关的云安全内容 0x01 法律 受法律约束的影响因素 云服务所在的地区云用户所在的区域数据主体所在的区域 GDPR:通用数据保护法案…...
倒计时功能分享
今天想要分享的是一个面试题,也是一个我们在项目中常用的功能:倒计时。 首先我们在写倒计时的时候必须要考虑到是:准确性、性能。接下来我们一步一步实现这个完美地倒计时功能。 setInterval 先来简单实现一个倒计时的函数: func…...
【论文分享】使用多源数据识别建筑功能:以中国三大城市群为例
建筑功能对城市规划至关重要,而利用多源数据进行建筑功能分类有助于支持城市规划政策。本研究通过分析建筑特征和POI密度,识别了中国三个城市群的建筑功能,并使用XGBoost模型验证了其在大规模映射中的高准确性和有效性。研究强调了建筑环境对…...
华为手机启用ADB无线调试功能
打开开发者模式,勾选USB调试,和“仅充电”模式下允许ADB调试 确认 设置添加adb路径到PATH变量 使用adb查看安卓设置 切换为无线模式: 查看手机IP...
云原生之Kubernetes集群搭建
1、Kubernetets基础概念 传统的服务器架构演进,现在基于docker容器化应用可以完成快速部署,但是对于大型的应用,有可能出现成百上千个容器化应用,一个挂了需要人工管理是相当麻烦,因此急需一个大规模容器编排系统。 Kubernetes Kubernetes 是一个可移植、可扩展的开源平…...
STM32单片机CAN总线汽车线路通断检测
目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着汽车电子技术的不断发展,车辆通信接口在汽车电子控…...
大连理工大学概率上机作业免费下载
大连理工大学概率论与数理统计上机资源 本资源库收录了大连理工大学概率论与数理统计课程的上机作业范例代码,旨在通过实际操作加深学生对概率统计概念的理解,帮助学生更好地理解和掌握知识点。 作业内容概览 第一题:随机变量关系探索 数…...
Tomcat 如何管理 Session
Tomcat 如何管理 Session 我们知道,Tomcat 中每一个 Context 容器对应一个 Web 应用,而 Web 应用之间的 Session 应该是独立的,因此 Session 的管理肯定是 Context 级的,也就是一个 Context 一定关联多个 Session。 Tomcat 中主…...
stm32启动过程解析startup启动文件
1.STM32的启动过程模式 1.1 根据boot引脚决定三种启动模式 复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。BOOT0 为专用引脚,而 BOOT1 则与 GPIO 引脚共用。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,可用于…...
SystemVerilog学习——构造函数new
一、概述 在 SystemVerilog 中,new 是一个构造函数,用于创建类的实例(即对象)。它在面向对象编程(OOP)中起着重要作用,负责实例化一个对象并进行初始化。与传统编程语言(如 C 或 Jav…...
力扣题目总结
1.游戏玩法分析IV AC: select IFNULL(round(count(distinct(Result.player_id)) / count(distinct(Activity.player_id)), 2), 0) as fraction from (select Activity.player_id as player_idfrom (select player_id, DATE_ADD(MIN(event_date), INTERVAL 1 DAY) as second_da…...
Java API 进阶指南:从核心API到高级应用的全面提升
文章目录 Java API 进阶学习指南1. 深入理解核心API1.1 集合框架(Collections Framework)1.2 输入输出流(I/O Streams)1.3 并发编程(Concurrency)1.4 反射(Reflection)1.5 泛型&…...
esp32c3开发板通过micropython的ubluetooth库连蓝牙设备
ESP32-C3开发板是一款高性能、低功耗的微控制器,搭载了Espressif自家的RISC-V处理器。通过MicroPython,一种面向微控制器的精简版Python编程语言,开发者可以轻松地为ESP32-C3编写代码。MicroPython的ubluetooth库使得ESP32-C3能够通过蓝牙与各…...
leetcode hot100【LeetCode 35.搜索插入位置】java实现
LeetCode 35.搜索插入位置 题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用 O(log n) 的时间复杂度来实现。 示例 1: 输入: nums [1,3,5,6…...
我们要用平凡来诠释非凡
#孟晚舟香港中文大学演讲# #华为价值观念# #并非站在山顶才能被看见# #传递正确的价值观# #如果信仰有颜色,那一定是中国红# #送给自己的价值理念# 在信息大爆炸的时代,很多同学都希望尽可能的抓取更多的知识,尽可能的不要遗漏任何热点…...
synchronized和volatile区别
synchronized和volatile是Java并发编程中两种重要的同步机制,它们之间存在明显的区别。以下是对这两者的详细比较: 一、基本定义与作用 synchronized 是一个用于实现线程同步的关键字。可以用来锁住方法或代码块,从而确保在同一时刻只有一个…...
125.验证回文串-力扣(LeetCode)
题目: 解题思路: 首先进行移除非字母数字字符,并将大写字符转换为小写字符的操作。这个过程中,主要利用快慢指针的方式来进行移除操作,通过加32将大写字符转换为小写字符。完成后,将前一半的数据与后一半的…...
线程间通信:wait和notify
线程间通信:wait和notify 1、Object的wait和notify方法 Java中的Object类提供了两个重要的方法,用于线程间的通信和同步:wait()方法和notify()方法 wait()方法的定义 方法签名:public final void wait() throws InterruptedEx…...
风险识别和管理的工具
1.风险识别工具和根本原因识别在项目管理中非常重要,常用的工具包括 因果图根本原因识别RCA鱼骨图 因果图 因果图是一种图形工具,用于识别问题或风险的根本原因。它通过将问题或风险因素与可能的根本原因联系起来,帮助团队更深入地了解问…...
qt之QFTP对文件夹(含嵌套文件夹和文件)、文件删除下载功能
一、前言 主要功能如下: 1.实现文件夹的下载和删除,网上很多资料都是单独对某个路径的文件操作的,并不能对文件夹操作 2.实现目标机中含中文名称自动转码,有些系统编码方式不同,下载出来的文件会乱码 3.实现ftp功能…...
为何数据库推荐将IPv4地址存储为32位整数而非字符串?
目录 一、IPv4地址在数据库中的存储方式? 二、IPv4地址的存储方式比较 (一)字符串存储 vs 整数存储 (二)IPv4地址"192.168.1.8"说明 三、数据库推荐32位整数存储方式原理 四、存储方式对系统性能的影响…...
Mybatis框架之责任链模式 (Chain of Responsibility Pattern)
在 MyBatis 框架中,责任链模式 (Chain of Responsibility Pattern) 被广泛应用于多个功能模块中,例如 插件拦截器、SQL 执行流程中的拦截器链、动态 SQL 的解析与处理等。这种设计模式为 MyBatis 提供了高度的扩展性和灵活性,使其能够轻松应对…...
C++ Stack和Queue---单向守护与无尽等待:数据结构的诗意表达
公主请阅 容器适配器容器适配器的特点 栈和队列的模拟实现deque的介绍1. 内存开销较高2.随机访问性能略低于 vector3. 与指针或迭代器的兼容性r4. 不适合用于需要频繁中间插入和删除的场景5. 在特定平台上的实现不一致6. 缺乏shrink_to_fit支持总结 题目 priority_queue 优先级…...
深入理解Java包装类与泛型的应用
今天我将带领大家进入Java包装类和泛型应用的学习。 我的个人主页 我的Java-数据结构专栏 :Java-数据结构,希望能帮助到大家。 一、Java包装类基础 二、Java泛型基础 三、Java包装类与泛型的结合 四、Java泛型进阶 五、Java包装类与泛型实战 一、Ja…...
【机器学习chp4】特征工程
推荐文章1,其中详细分析了为什么L1正则化可以实现特征选择(特征剔除) 【王木头 L1、L2正则化】三个角度理解L1、L2正则化的本质-CSDN博客 推荐文章2,里面详细分析了奇异值分解 【线性代数】矩阵变换-CSDN博客 本文遗留问题&#…...
LeetCode螺旋矩阵
快一个月没刷题了,最近工作有些忙,今天闲下来两小时,刷一道 题目描述 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4…...
第十五届蓝桥杯JAVA的B组题目详情解析
(第一个填空太简单,就不写了,根本不用代码,直接excel计算) 目录 蓝桥杯第二个填空,类斐波那契循环数 蓝桥杯JAVA.b组第三题 -分布式队列(模拟) 食堂(蓝桥杯D题) 编辑 星际旅行(Floyd佛洛依德) 其余的有点变态,感觉学了好像…...
在几分钟内将数据从 Oracle 迁移到 ClickHouse
ClickHouse 是一个开源的面向列的数据库管理系统。它在实时数据处理方面的出色性能显着增强了数据分析和业务洞察力。将数据从 Oracle 迁移到 ClickHouse 可以释放数据在决策中的力量,这是单独使用 Oracle 无法实现的。 本教程介绍如何使用 BladePipe 将数据从 Orac…...
上海的外贸网站建设公司排名/百度seo优化软件
自定义安装程序 有时需要在包的安装过程中执行其它的动作,例如:将它安装在默认的 vendor 以外的其它目录。 在这些情况下,你可以考虑创建一个自定义安装程序来处理特定的逻辑。 调用自定义安装程序 假设你的项目已经有了一个自定义的安装模块…...
深圳网站建设方案优化/北京百度seo排名点击器
效率好低,,,, 今天一天没有吧区间dp结束, 好吧,今晚加把劲,争取结束, 继续努力吧, 看博客, 。...
网站建设教程书籍免费下载/百度一下你就知道官网
为了在原有MFC程序上支持WPF的Ink功能,看了N天的.Net相关知识。我的机器上,开发环境实在是令人发指,如果有人碰到了我现在的问题,希望这篇文章能够对他有所帮助。我安装了Visusal Studio 2005,.Net Framework 2.0, 3.5…...
网站建设电话销售不被挂断/搜狐财经峰会
在Hive中还有一项比较好用的功能,也是非常重要的功能:在建表的时候可以不指定表的行、字段、列的分隔方式,通过给表指定一段正则表达式,让Hive自动去匹配; 1、创建表 CREATE TABLE apachelog (dates STRING,times STRI…...
wordpress 登录 不同/郴州seo网络优化
LFM为推荐系统中,矩阵分解的执牛耳者。由于SVD不善于处理稀疏向量,因此目前最常用的矩阵(共现矩阵)分解的方法就是LFM。LFM原理想要了解LFM,首先要知道共现矩阵,共现矩阵是一个二维矩阵,每个用户对每个物品的打分的矩阵…...
潍坊网站建设公司排名/搜索词排行榜
Linux主机名的设置 Linux主机名的设置步骤如下: 1、在/etc/sysconfig/network文件中修改HOSTNAME的值为要设置的主机名。 HOSTNAMEmyhost 2、在/etc/hosts文件末尾增加如下一行内容: 127.0.0.1 myhost 3、reboot系统,之后主机名生效。 转载于…...