业务场景---Token无感刷新
业务场景描述
假设用户正在填写一个复杂的表单,由于表单内容繁多,用户花费了很长时间才填完。这时,如果Token已经过期,系统会让用户重新登录,这种体验显然是非常糟糕的。为了避免这种情况,我们需要在Token即将过期或已经过期时,自动刷新Token,而不影响用户正在进行的操作。
技术实现思路
一、准备工作
- 前端框架选择:本文以Vue.js为例,结合Vue Router和Axios来实现Token无感刷新机制。
- 后端支持:后端需要提供刷新Token的接口,当接收到旧的Token时返回一个新的Token。
二、关键技术点
- 拦截请求:使用Axios拦截器来检测每一个请求的状态,如果发现Token过期,则触发刷新Token的逻辑。
- 刷新Token:实现一个专门用于刷新Token的方法,该方法会在旧的Token过期时自动调用并更新Token。
- 请求队列:在刷新Token期间,暂停其他需要Token的请求,待Token刷新成功后,重新发送这些请求。
三、具体实现步骤
1. 配置Axios拦截器
首先,配置Axios拦截器来检测请求和响应的状态,并在Token过期时触发刷新Token的逻辑。
import axios from 'axios';
import store from './store'; // 假设使用Vuex来管理全局状态
import router from './router'; let isRefreshing = false;
let requests = []; axios.interceptors.request.use(
config => {
const token = store.state.token;
if (token) {
config.headers['Authorization'] = 'Bearer ' + token;
}
return config;
},
error => {
return Promise.reject(error);
}
); axios.interceptors.response.use(
response => {
return response;
},
error => {
const { config, response } = error;
const originalRequest = config; if (response && response.status === 401) {
if (!isRefreshing) {
isRefreshing = true;
return refreshToken().then(newToken => {
store.commit('setToken', newToken);
originalRequest.headers['Authorization'] = 'Bearer ' + newToken;
processQueue(null, newToken);
return axios(originalRequest);
}).catch(err => {
processQueue(err, null);
store.commit('logout');
router.push('/login');
return Promise.reject(err);
}).finally(() => {
isRefreshing = false;
});
} else {
return new Promise((resolve, reject) => {
requests.push((token) => {
originalRequest.headers['Authorization'] = 'Bearer ' + token;
resolve(axios(originalRequest));
});
});
}
}
return Promise.reject(error);
}
); function processQueue(error, token = null) {
requests.forEach(promise => {
if (error) {
promise.reject(error);
} else {
promise.resolve(token);
}
});
requests = [];
}
2. 实现刷新Token的方法
接下来,实现一个用于刷新Token的方法refreshToken。这个方法会调用后端接口来获取新的Token。
function refreshToken() {
return new Promise((resolve, reject) => {
axios.post('/auth/refresh', {
refreshToken: store.state.refreshToken
}).then(response => {
if (response.data.success) {
resolve(response.data.token);
} else {
reject(response.data.message);
}
}).catch(error => {
reject(error);
});
});
}
3. 更新Vuex状态管理
确保在Vuex中有相关的状态和方法来管理Token和用户登录状态。
const store = new Vuex.Store({
state: {
token: localStorage.getItem('token') || '',
refreshToken: localStorage.getItem('refreshToken') || '',
user: {}
},
mutations: {
setToken(state, token) {
state.token = token;
localStorage.setItem('token', token);
},
setRefreshToken(state, refreshToken) {
state.refreshToken = refreshToken;
localStorage.setItem('refreshToken', refreshToken);
},
logout(state) {
state.token = '';
state.refreshToken = '';
state.user = {};
localStorage.removeItem('token');
localStorage.removeItem('refreshToken');
}
}
});
4. 处理登录逻辑
确保在用户登录时,正确地存储Token和刷新Token。
function login(credentials) {
return axios.post('/auth/login', credentials).then(response => {
store.commit('setToken', response.data.token);
store.commit('setRefreshToken', response.data.refreshToken);
});
}
总结:当用户在填写复杂表单时,即使Token过期也不会中断他们的操作,从而提供了更好的用户体验。这个机制不仅适用于表单填写,还可以广泛应用于任何需要长时间交互的Web应用场景中。
业务场景---Token无感刷新的更多相关文章
- 无感刷新 Token
什么是JWT JWT是全称是JSON WEB TOKEN,是一个开放标准,用于将各方数据信息作为JSON格式进行对象传递,可以对数据进行可选的数字加密,可使用RSA或ECDSA进行公钥/私钥签名. 使 ...
- Spring Cloud实战 | 最八篇:Spring Cloud +Spring Security OAuth2+ Axios前后端分离模式下无感刷新实现JWT续期
一. 前言 记得上一篇Spring Cloud的文章关于如何使JWT失效进行了理论结合代码实践的说明,想当然的以为那篇会是基于Spring Cloud统一认证架构系列的最终篇.但关于JWT另外还有一个 ...
- axios实现无感刷新
前言 最近在做需求的时候,涉及到登录token,产品提出一个问题:能不能让token过期时间长一点,我频繁的要去登录. 前端:后端,你能不能把token 过期时间设置的长一点. 后端:可以,但是那样做 ...
- 基于OAuth2.0的token无感知刷新
目前手头的vue项目关于权限一块有一个需求,其实架构师很早就要求我做了,但是由于这个紧急程度不是很高,最近临近项目上线,我才想起,于是赶紧补上这个功能.这个项目是基于OAuth2.0认证,需要在每个请 ...
- Modelarts与无感识别技术生态总结(浅出版)
[摘要] Modelarts技术及相关产业已成为未来AI与大数据重点发展行业模式之一,为了促进人工智能领域科学技术快速发展,modelarts现状及生态前景成为研究热点.笔者首先总结modelarts ...
- 整理分布式锁:业务场景&分布式锁家族&实现原理
1.引入业务场景 业务场景一出现: 因为小T刚接手项目,正在吭哧吭哧对熟悉着代码.部署架构.在看代码过程中发现,下单这块代码可能会出现问题,这可是分布式部署的,如果多个用户同时购买同一个商品,就可能导 ...
- 拨乱反正:DDD 回归具体的业务场景,Domain Model 再再重新设计
首先,把最真挚的情感送与梅西,加油! 写在前面 阅读目录: 重申业务场景 Domain Model 设计 后记 上一篇<设计窘境:来自 Repository 的一丝线索,Domain Model ...
- 受教了,memcache比较全面点的介绍,受益匪浅,适用memcached的业务场景有哪些?memcached的cache机制是怎样的?在设计应用时,可以通过Memcached缓存那些内容?
基本问题 1.memcached的基本设置 1)启动Memcache的服务器端 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 ...
- DDD 回归具体的业务场景,Domain Model 再再重新设计
DDD 回归具体的业务场景,Domain Model 再再重新设计 首先,把最真挚的情感送与梅西,加油! 写在前面 阅读目录: 重申业务场景 Domain Model 设计 后记 上一篇<设计窘 ...
- kaggle 欺诈信用卡预测——不平衡训练样本的处理方法 综合结论就是:随机森林+过采样(直接复制或者smote后,黑白比例1:3 or 1:1)效果比较好!记得在smote前一定要先做标准化!!!其实随机森林对特征是否标准化无感,但是svm和LR就非常非常关键了
先看数据: 特征如下: Time Number of seconds elapsed between each transaction (over two days) numeric V1 No de ...
随机推荐
- Abp vNext框架 基础知识 依赖注入
依赖注入 ABP的依赖注入系统是基于Microsoft的依赖注入扩展库(Microsoft.Extensions.DependencyInjection nuget包)开发的.因此,它的文档在ABP中 ...
- 适用于linux的bilibiliB站直播间弹幕爬虫脚本
适用于linux的bilibiliB站直播间弹幕爬虫脚本,命令行运行之,输入到命令行,部分内容参考自网络,代码底部可见原始代码出处 BUFF:然而,经测试,每次爬只能读取10条弹幕记录,这就使得在(s ...
- [SHOI2011]双倍回文 题解
[SHOI2011]双倍回文 题解 看了一些写回文自动机的大佬的代码,我深感敬畏,于是我转身向Manacher走去 现在荣登最优解第一页-- 说实话,这个方法的复杂度是很玄学的,但是加了一些优化之后, ...
- SpringBoot系列(七) jpa的使用,以增删改查为例
JPA是Java Persistence API的简称,Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 它是SUN公司推出的一套基 ...
- 一款.NET开源、功能强大、跨平台的绘图库 - OxyPlot
前言 今天大姚给大家分享一款.NET开源(MIT License).免费.跨平台.功能强大的绘图库,支持多平台使用(包括:WPF.UWP.WinForm.Silverlight.Xamarin.iOS ...
- Mysql行转列,列转行 WITH ROLLUP 统计
Mysql行转列,列转行 WITH ROLLUP 统计 DROP TABLE IF EXISTS tb_score; CREATE TABLE tb_score( id INT(11) NOT NUL ...
- mongodb客户端操作语法笔记
##登录连接: 进入客户端方法D:\Program Files\MongoDB\Server\5.0\bin>mongo.exe > db.runoob.insert({"nam ...
- windows server 安装.net framework 3.5失败
windows server如果高版本的.net framework 那么在安装.net framework3.5时会提示已安装高版本的不能安装低版本的了 ---------------------- ...
- Kotlin 变量详解:声明、赋值与最佳实践指南
Kotlin 变量 变量是用于存储数据值的容器. 要创建一个变量,使用 var 或 val,然后使用等号(=)给它赋值: 语法 var 变量名 = 值 val 变量名 = 值 示例 var name ...
- python实现推送消息到微信公众号
使用到库: Requests 实现方式: 微信已开放了对应的接口,直接通过python的requests库,发起请求,实现推送消息到公众号 微信公众号准备: 1.没有注册微信公众号,可以使用微信提供的 ...