学习笔记-JWT 保持登录状态
目录
一、解析 token
1. 在 JWT 工具类添加解析 token 的方法
2. 在 Controller 添加获取用户数据的方法
二、获取用户信息
1. 发起 axios 请求用户信息
2. 在路由守卫中调用方法
3. 使用
三、token 时效性
1. 设置 token 过期时间
2. 判断 token 是否过期
3. 在拦截器中判断返回的状态码
四、路由报错
1. 重复提示 token 已过期
2. 路由跳转报错
五、解决方案
1. 解决跳转路由报错问题
2. 提示两次 token 过期问题
六、优化路由守卫
七、前后端拦截过程图
接上次的问题,使用 vuex 保存用户信息,页面一刷新数据就没了
解决方案是刷新后再请求一下数据,获取一下用户信息。
本次结合 JWT 来实现刷新页面后再次请求用户信息,这次是基于 token 来获取用户信息
我们知道 token 里包含了用户信息,那么我们只需要解析一下 token 就可以获取到数据了,就不需要再次请求数据库获取数据了
如果对 token 不是很了解的同学,可以看一下这篇文章 JWT 登录鉴权 ,本篇文章是基于这个文章
一、解析 token
1. 在 JWT 工具类添加解析 token 的方法

2. 在 Controller 添加获取用户数据的方法
@RequestMapping("/GetAdminInfo")@ResponseBodypublic responseDTO GetAdminInfo(String token) {Claims claims = JwtUtil.parseToken(token); // 调用工具类获取 token 中的数据Object adminInfo = claims.get("adminInfo"); // 获取用户信息return new responseDTO(200, adminInfo, "获取成功", 0);}
二、获取用户信息
现在服务器已经可以解析 token 并返回用户信息了,
那么在前端怎么设置每次刷新后请求一下用户信息呢?
1. 发起 axios 请求用户信息
在 vuex 的状态管理器,也就是 store 文件,的 actions 中 创建一个方法,该方法通过发起 axios 请求获取用户信息,参数是 token 获取 token 方法

因为刷新和跳转界面都会先经过路由守卫,所以在路由守卫里判断是否调用获取用户信息的方法就可以了
2. 在路由守卫中调用方法

3. 使用
然后就可以在主页使用了,或者在其他页面使用

这样每次刷新或者跳转页面都会发送一个获取用户信息的请求

虽然这样实现了保持登录状态,但是这属于永久性保持登录状态。一般大型网站中 token 会有时效性,也就是多长时间 token 就会生效,就需要重新登陆
三、token 时效性
1. 设置 token 过期时间
这里为了方便测试,所以设置有效的时间为10秒,这个可以设置的长一点

2. 判断 token 是否过期
如果token 过期了,拦截请求,并且返回信息

3. 在拦截器中判断返回的状态码

当 token 过期后,提示 token过期,并跳转到登录界面

四、路由报错
当 token 过期后,刷新页面会跳转到登录界面
在登录页面的地址栏直接修改为主页的路径,然后回车就会连续提示两次 token 已过期,再然后就出现报错界面了

1. 重复提示 token 已过期
第一次出现 token 过期提示是因为 路由进行了切换,我们前面设置了每次刷新或跳转路由都会发起一条请求,解析 token 获取用户信息,token 已经过期了,所以就会提示

第二次提示 是因为进入主页面后,主页面的组件会自动获取菜单数据,
我们设置了请求拦截器,每次发起请求都会添加一个 token,服务器的拦截器会检查 token是否过期


2. 路由跳转报错
这个报错信息是 跳转到当前的路由,也就是说 从 A路由 跳转到 A路由,目的路由和出发路由是一样的,vue 认为这是冗余的操作

五、解决方案
1. 解决跳转路由报错问题
在响应拦截器中判断跳转目的路由是否为当前路由

2. 提示两次 token 过期问题
在第一次提示 token 过期后就不要让路由再跳转到主页面了

在 vuex 的状态管理器 文件的 actions 中 获取用户信息的方法修改为同步方法

在路由守卫中,调用获取用户信息的方法 添加回调函数

这样就不会连续提示两次了
六、优化路由守卫
把路由守卫的代码放在一个文件中,不用和路由器放在一起

在 main.js 文件中引入文件

这是因为 引入了文件没有使用

关闭 eslint 的提示,然后重启一下 vue

七、前后端拦截过程图

相关文章:
学习笔记-JWT 保持登录状态
目录 一、解析 token 1. 在 JWT 工具类添加解析 token 的方法 2. 在 Controller 添加获取用户数据的方法 二、获取用户信息 1. 发起 axios 请求用户信息 2. 在路由守卫中调用方法 3. 使用 三、token 时效性 1. 设置 token 过期时间 2. 判断 token 是否过期 3. 在拦截…...
React 性能优化
使用 useMemo 缓存数据 (类似 vue 的 computed)使用 useCallback 缓存函数异步组件 ( lazy )路由懒加载( lazy )服务器渲染 SSR用 CSS 模拟 v-show 循环渲染添加 key使用 Fragment (空标签)减少层级 不在JSX 中定义函数࿰…...
后端常见问题及深度解决方案
🐟作者简介:一名大三在校生,喜欢编程🪴 🐡🐙个人主页🥇:Aic山鱼 🐠WeChat:z7010cyy 🦈系列专栏:🏞️ 前端-JS基础专栏✨前…...
C:野指针介绍(定义、危害、规避)以及野指针与空指针的区分
目录 1、野指针 1.1 野指针的成因 1.指针未初始化 2.指针越界访问 3.指针指向的空间释放 1.2 野指针的危害 1.3 如何规避野指针 1. 指针初始化 2. 小心指针越界 3.指针变量不使用就及时赋上NULL 4. 指针使用前检查是否是空指针 5. 避免返回局部变量的地址 1.4 区…...
vue中v-html 后端返回html + script js中click事件不生效
效果图: 需求:点击加号执行后端返回的script中的代码 后端返回的html: <!DOCTYPE html> <html langzh> <head> <title>xxx</title> <style>body{font-size: 14px}p{text-indent: 30px;}textarea{width…...
介绍maven生命周期-水温
Maven生命周期是指一系列的构建阶段,包括项目的清理、编译、测试、打包、部署等。Maven通过定义生命周期来规范项目构建过程,使得开发人员可以方便地执行一系列的构建任务。 Maven的生命周期分为三个阶段: clean生命周期:主要用…...
spring boot3.x快速入门
下一篇:Spring Boot 3.x gradle脚手架工程build.gradle详解 本教程将基于gradle项目构建工具来快速构建一个spring boot 3.x的最简单的web应用,其中涉及各种构建技巧和细节,希望能帮到初学者~ 文章目录 先决条件JDK17gradle全局配置 gradle项…...
JavaWeb之servlet关于Ajax实现前后端分离
一、什么是Ajax: AJAX Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 AJAX 不是新的编程语言,而是一种使用现有标准的新方法。 AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部…...
vue3表格组件formatter
有时候在网页上显示表格数据时,表格的某些列值只有有限数目(例如,启用/停用),这时候后端常常使用不同的数据值表示不同状态,前端怎么将这些数据值转化为相应的列值呢? 我们可以采用vue3表格组件…...
C# 使用NHibernate连接MySQL实现数据的增删改查
使用 NHibernate 连接 MySQL 并实现数据的增删改查操作是一个非常典型的场景。以下是一个简单的示例,演示了如何配置 NHibernate 与 MySQL 连接并进行基本的 CRUD 操作。 目录 步骤 1: 安装必要的包 步骤 2: 配置 NHibernate 配置文件方式 代码方式 步骤 3: 定…...
IDEA2024.2重磅发布,更新完有4G!
JetBrains 今天宣布了其 IDE 家族版本之 2024.2 更新,其亮点是新 UI 现在已是默认设置,并且对 AI Assistant (AI助手)进行了几项改进。 安装密道 新 UI 的设计更加简约,可以根据需要以视觉方式扩展复杂功能。值得开发…...
QWT+Qt Creator+MSVC的配置与使用
目录 一、介绍 二、QWT下载 三、QWT编译 3.1 设置构建套件 3.2 修改QWT相关文件 3.3 进行QWT编译 四、QWT配置 4.1 配置QWT的lib文件 4.2 配置QWT的dll文件 4.3 配置QWT的designer的dll文件 五、代码实验 一、介绍 QWT,全称是Qt Widgets for Technical…...
Netty高性能数据结构
文章目录 Netty高性能数据结构FastThreadLocalHashedWheelTimer时间轮Mpsc无锁队列 Netty高性能数据结构 Netty 用高性能数据结构的主要目的是为了提高网络通信的效率和系统的整体性能。 所谓的高性能数据结构是指,那些在特定场景下优化了性能和效率的数据结构&am…...
关于百度、微软语音合成的实现案例
关键词 自助机产品、排队呼叫功能、网络喇叭、百度语音合成SDK、微软TTS 阅读建议 对自助机产品功能扩展感兴趣的读者、需要实现远程语音呼叫功能的开发者、想要了解网络喇叭选型及其使用的技术人员、对百度语音合成SDK和微软TTS感兴趣的开发者 阅读时长 预计阅读时长…...
二叉树:镜像树,子结构,二叉树转链表,二叉树的倒数K个数,对称,Z型打印
1.把一棵二叉树转换为它的镜像树。 void mirror_tree(TreeNode *root) {if(rootNULL) return ;TreeNode *temproot->right;root->rightroot->left;root->lefttemp;mirror_tree(root->right);mirror_tree(root->left);}2、输入两棵二叉树A,B&…...
瑞秋,詹妮弗·安妮斯顿多年来与本·阿弗莱克保持着“调情”友谊 又一个詹妮弗
尽管所有迹象都表明本阿弗莱克和詹妮弗洛佩兹的婚姻即将走向离婚,但他尚未公开评论此事。不过,好莱坞圈内人士已经纷纷将他与另一位名人联系起来。事实上,是另一位詹妮弗。 一位消息人士向媒体透露,詹妮弗安妮斯顿和阿弗莱克一直都很有默契——无论是在银幕上还是在银幕外…...
指纹失效,忘记iPhone屏幕解锁密码怎么应对?
为保证手机的安全及隐私,我们会给手机设置屏幕锁屏密码,通过输入设置密码来解锁手机屏幕锁,但为了给大家提供快速便捷的解锁方式,苹果公司提供了指纹解锁,不仅解锁更便捷了还极大地增强了设备的安全性。但有时我们手指…...
09.XSS跨站脚本攻击(超详细!!!)
1、什么是XSS XSS(跨站脚本攻击):攻击者利用这个漏洞将恶意脚本注入到网页中,当其它用户浏览这些页面时,恶意脚本会在用户的浏览器中执行。XSS攻击允许攻击者在用户的浏览器上执行脚本,从而可能获取用户的…...
讲解人工智能在现代科技中的应用和未来发展趋势-水文
人工智能(Artificial Intelligence,简称AI)是一种模拟人类智能的科技领域,它通过计算机模拟人类的思维、学习、推理和决策能力,以便解决复杂的问题。近年来,人工智能技术的发展取得了惊人的进展,…...
2.2 QT 环境配置
2.2 QT环境配置 QT是一个1991年由QT Company开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序,也可以用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器&…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
