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

无感刷新token

无感刷新

无感刷新Token技术是一种用于实现持久登录体验的关键技术,它通过在用户登录后自动刷新Token,以延长用户的登录状态,避免频繁要求用户重新登录。

实现

使用access_token(短效token)和refresh_token(长效token),当请求拦截判断属于access_token过期时,使用refresh_token获取一组新的token,并且将所有无效请求入队列,等拿到有效token时依次出队列重新请求。

后端

使用nestjs写了几个测试用的接口

controller.ts

import { Body, Query, Controller,Request, Get, Post, BadRequestException, Inject, Req, UnauthorizedException } from '@nestjs/common';
import { AppService } from './app.service';
import { UserDto } from './dto/user.dto';
import { JwtService } from "@nestjs/jwt"
const users = [{ username:"admin", password:"admin" },{ username:"zhangsan", password:"123" },
]@Controller()
export class AppController {constructor(private readonly appService: AppService) {}@Inject(JwtService)private jwtService:JwtService;@Get()getHello(): string {return this.appService.getHello();}@Post('login')login(@Body() userDto : UserDto){const user = users.find(item => item.username === userDto.username);if(!user) {throw new BadRequestException('用户不存在');}if(user.password !== userDto.password) {throw new BadRequestException("密码错误");}const accessToken = this.jwtService.sign({username:user.username,}, {expiresIn: '0.001h'})const refreshToken =  this.jwtService.sign({username:user.username,}, {expiresIn: '7d'})return {userInfo: {username: user.username,},accessToken: accessToken,refreshToken: refreshToken};}@Get("aaa")aaa(@Req() req: Request){const authorization = req.headers['authorization'];if(!authorization){throw new UnauthorizedException("用户未登录")}try {const token = authorization;const data = this.jwtService.verify(token);console.log(data);return 'aaa'} catch (error) {throw new UnauthorizedException("token失效,请重新登录")}}@Get("bbb")bbb(@Req() req: Request){const authorization = req.headers['authorization'];if(!authorization){throw new UnauthorizedException("用户未登录")}try {const token = authorization;const data = this.jwtService.verify(token);console.log(data);return 'bbb'} catch (error) {throw new UnauthorizedException("token失效,请重新登录")}}@Get('refresh')refresh(@Query('token') token: string) {try{const data = this.jwtService.verify(token);const user = users.find(item => item.username === data.username);const accessToken = this.jwtService.sign({username: user.username,}, {expiresIn: '0.001h'});const refreshToken = this.jwtService.sign({username: user.username}, {expiresIn: '7d'})return {accessToken,refreshToken};} catch(e) {throw new UnauthorizedException('token 失效,请重新登录');}}}

其中login生成 access_token 和 refresh_token

前端请求封装

import axios from 'axios';
import { userStore } from "@/store/user.js"
const store = userStore();
class RequestQueue {constructor() {this.queue = [];this.isRefresh = false;}// 入队enqueue(value) {return this.queue.push(value);}// 出队dequeue() {return this.queue.shift();}// 取队头元素peek() {return this.queue[0];}// 判断队列是否为空isEmpty() {return this.queue.length === 0;}// 取队列有多少个元素size() {return this.queue.length;}// 清空队列clear() {this.queue = [];}setIsRefresh(isRefresh){return this.isRefresh = isRefresh}
}
//1. 创建axios对象
const service = axios.create({baseURL: import.meta.env.VITE_APP_BASE_API,// 超时timeout: 10000});
//2. 请求拦截器
service.interceptors.request.use(config => {console.log('store拦截信息',store)if(store.accessToken){config.headers.Authorization = store.accessToken;}return config;
}, error => {Promise.reject(error);
});let requests = new RequestQueue;  // 请求队列
//3. 响应拦截器
service.interceptors.response.use(response => {//判断code码return response.data;
},error => {if(error.response.status == 401){// token过期处理// 请求入队requests.enqueue(error.response.config);if(!requests.isRefresh){requests.setIsRefresh(true)store.doRefreshToken().then(res=>{while(!requests.isEmpty()){let config = requests.dequeue()config.Authorization = store.accessTokenservice.request(config)}requests.setIsRefresh(false)});}} else {// token请求没有过期return new Promise((resolve,reject)=>{reject(error)});}
});
export default service;

相关文章:

无感刷新token

无感刷新 无感刷新Token技术是一种用于实现持久登录体验的关键技术,它通过在用户登录后自动刷新Token,以延长用户的登录状态,避免频繁要求用户重新登录。 实现 使用access_token(短效token)和refresh_token&#xf…...

【Python大数据笔记_day06_Hive】

hive内外表操作 建表语法 create [external] table [if not exists] 表名(字段名 字段类型 , 字段名 字段类型 , ... ) [partitioned by (分区字段名 分区字段类型)] # 分区表固定格式 [clustered by (分桶字段名) into 桶个数 buckets] # 分桶表固定格式 注意: 可以排序[so…...

Netty--文件编程

3. 文件编程 3.1 FileChannel ⚠️ FileChannel 工作模式 FileChannel 只能工作在阻塞模式下 获取 不能直接打开 FileChannel,必须通过 FileInputStream、FileOutputStream 或者 RandomAccessFile 来获取 FileChannel,它们都有 getChannel 方法 通过…...

SVN 服务器建立

1.建立SVN库 svnadmin create cat svndir/conf/passwd 修改SVN用户密码 chenht 123456 2.建立目录权限 [aliases] # joe /CXZ/STDessert/LSnake City/OSnake Oil, Ltd./OUResearch Institute/CNJoe Average [groups] # harry_and_sally harry,sally # harry_sally_…...

iPhone或在2024开放第三方应用商店。

iPhone或开放第三方应用商店,可以说这是一个老生常谈的话题。对于像是iOS这样封闭的系统来说,此前传出苹果可能开放侧载消息的时候,又有谁能信,谁会信? 如果是按照苹果自身的意愿,这种事情自然是不可能发生…...

《C和指针》笔记36:动态内存分配

1. malloc和free C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放。这些函数维护一个可用内存池。当一个程序另外需要一些内存时,它就调用malloc函数,malloc从内存池中提取一块合适的内存,并向该…...

C/S架构学习之基于UDP的本地通信(服务器)

基于UDP的本地通信(服务器):创建流程:一、创建数据报式套接字(socket函数): int sock_fd socket(AF_UNIX,SOCK_DGRAM,0);if(-1 sock_fd){perror("socket error");exit(-1);}二、创建…...

excel如何加密(excel加密的三种方法)

Excel是一款广泛使用的办公软件,有时候我们需要对一些重要的Excel文件进行加密,以保证文件的安全性。下面将介绍3种常用的Excel加密方法。 方法一:通过路径文件-另存为-工具-常规选项-设置打开或修改权限密码(密码只可以使数字、字…...

玩了个锤子游戏小程序搭建流程:探索深度与逻辑的结合

随着移动互联网的普及,小程序已经成为了越来越多用户的选择。在这个背景下,玩了个锤子游戏小程序应运而生,它为用户提供了一个全新的游戏体验。那么,如何搭建这样一个小程序呢?本文将为大家详细介绍玩了个锤子游戏小程…...

召回率计算及影响因素

召回率是指在所有正样本中,被成功预测为正样本的样本数占比。在机器学习领域,召回率是评估模型预测性能的重要指标之一。在本文中,我们将从多个方面深入探讨召回率的概念和应用。 阈值越高,精准率越高,召回率越低&…...

在Qt中怎么由函数定义自动创建函数实现模板

2023年11月12日,周日凌晨...

【算法】算法题-20231112

算法题 一、459. 重复的子字符串二、414. 第三大的数三、520. 检测大写字母四、680. 验证回文串 II五、283. 移动零 一、459. 重复的子字符串 简单 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true…...

目标检测YOLO实战应用案例100讲-基于多目标追踪的交通场景异常检测(续)

目录 3.5特征融合网络改进:小目标检测层 3.5.1小目标检测层 3.6实验结果与讨论...

最新支付宝转卡码生成之转账源代码(隐藏部分卡号)

一、需要准备好自己的卡号、名称、以及对应的姓名 二、然后将自己的信息填入下面的代码中 三、然后将拼接好的代码,利用转码技术生产对应的二维码 四、这样一个跳转银行卡二维码的转账码就做好了 效果演示:如下 支付宝扫码、跳转码、转卡码、隐藏卡号…...

聊天机器人框架Rasa资源整理

Rasa是一个主流的构建对话机器人的开源框架,它的优点是几乎覆盖了对话系统的所有功能,并且每个模块都有很好的可扩展性。参考文献收集了一些Rasa相关的开源项目和优质文章。 一.Rasa介绍 1.Rasa本地安装 直接Rasa本地安装一个不好的地方就是容易把本地…...

魔搭社区LLM模型部署实践, 以ChatGLM3为例(一)

魔搭社区LLM模型部署实践, 以ChatGLM3为 例 本文以ChatGLM3-6B为例, 主要介绍在魔搭社区如何部署LLM, 主要包括如下内容: ● SwingDeploy - 云端部署, 实现零代码一键部署 ● 多端部署 - MAC个人笔记本,…...

25期代码随想录算法训练营第十四天 | 二叉树 | 层序遍历(10道题)、226.翻转二叉树 、101.对称二叉树 2

目录 层序遍历 10226.翻转二叉树101.对称二叉树 2 层序遍历 10 链接 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right clas…...

ubuntu cp210x(USB转串口)驱动安装教程

ubuntu cp210x(USB转串口)驱动安装 前言1. 驱动下载2. 驱动编译和安装3. 可能遇到的问题及解决办法3.1 第一种解决方案:检查当前是否已有CP210x.ko驱动3.2 第二种解决方案:修改驱动文件,编译 前言 CP2108 是一款高度集…...

Spring-SpringAOP的实现

对Spring AOP的理解 OOP表示面向对象编程,是一种编程思想,AOP表示面向切面编程,也是一种编程思想 Spring AOP:Spring为了让程序员更加方便的做到面向切面编程所提供的技术支持 Spring提供的一套机制,让我们更容易的…...

js:Browserslist用特定语句查询浏览器列表的工具与Babel和Postcss配置使用

目录 BrowserslistBabel 和 BrowserslistPostcss 和 Browserslist推荐配置参考文章 Browserslist Browserslist 是一个用特定语句查询浏览器列表的工具 文档 https://www.npmjs.com/package/browserslisthttps://github.com/browserslist/browserslist#full-list 安装 pnp…...

光学仿真进阶:利用MATLAB优化贝塞尔高斯光束传输性能的3个技巧

光学仿真进阶:利用MATLAB优化贝塞尔高斯光束传输性能的3个技巧 贝塞尔高斯光束在激光加工、光学镊子和生物成像等领域展现出独特优势,但精确仿真其传输特性往往面临计算效率与精度的双重挑战。许多工程师在完成基础仿真后,常陷入"参数微…...

PCB设计实战:机械孔选型、布局与可靠性设计全解析

1. 机械孔的基础认知与分类详解 机械孔在PCB设计中就像建筑物的承重柱,既要承担物理支撑又要兼顾功能传导。我第一次设计带大功率器件的PCB时,就因为机械孔选型不当导致散热不良,整个项目返工。现在回头看,机械孔的选择其实有章可…...

Go语言怎么用Kafka_Go语言Kafka消息队列教程【对比】

Kafka在Go中可靠性取决于配置匹配:sarama需显式设RequiredAcksWaitForAll、Return.Successestrue及正确Version;kafka-go更简洁但兼容性弱;网络配置、advertised.listeners和认证易致生产超时。Kafka 在 Go 里不是“装个包就能用”&#xff0…...

Ostrakon-VL-8B实战:利用LSTM时序模型增强视频片段内容理解

Ostrakon-VL-8B实战:利用LSTM时序模型增强视频片段内容理解 你有没有遇到过这样的场景?面对一段几分钟的监控录像,需要快速知道里面发生了什么;或者刷到一个短视频,想让它自动生成一段文字描述。单纯靠人眼去看、人脑…...

3分钟掌握B站视频精髓:BiliTools AI总结功能终极指南

3分钟掌握B站视频精髓:BiliTools AI总结功能终极指南 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools 在…...

质押经济革命:DApp+NFT双引擎开发全解析与亿级市场突围策略

引言:区块链3.0时代的价值重构机遇在Web3.0浪潮席卷全球的当下,区块链技术正从加密货币交易向深度价值赋能转型。据DappRadar 2025年Q4数据显示,质押类DApp用户规模同比增长217%,NFT质押市场年交易量突破89亿美元,质押…...

告别DWConv卡顿!用Pytorch手把手实现CVPR 2023的PConv(附完整代码与性能对比)

告别DWConv卡顿!用PyTorch手把手实现CVPR 2023的PConv(附完整代码与性能对比) 在移动端和边缘计算场景中,模型推理速度往往成为制约落地的关键瓶颈。许多工程师发现,即使采用深度可分离卷积(DWConv&#xf…...

如何用GetQzonehistory一键备份QQ空间?终极数据保存指南

如何用GetQzonehistory一键备份QQ空间?终极数据保存指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心QQ空间里那些珍贵的青春记忆会随着时间流逝而消失&#x…...

抓取不规则表面物体机械手的设计

目 录 第一章 绪论 1 1.1 课题研究的意义及背景 1 1.2 机械手研究概况 2 1.2.1国外研究现状 2 1.2.2国内研究现状 2 1.3 研究的内容 2 第二章 抓取物体机械手总体结构设计 4 2.1机械手设计思路 4 2.2总体方案的设计 5 2.2.1驱动方式的选择 5 2.2.2传动结构的分析 6 2.2.3传动方…...

网络初级第二次作业(静态路由配置)

一、网络拓扑图二、配置路由器改名和配置路由器:以AR1为例三、配置 PC端的网络参数:为PC1和PC2配置静态IP地址:四、配置静态路由为四个路由器分别配置静态路由:以AR3和AR4为例五、Ping测试...