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

学习笔记-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 中定义函数&#xff0…...

后端常见问题及深度解决方案

🐟作者简介:一名大三在校生,喜欢编程🪴 🐡🐙个人主页🥇: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事件不生效

效果图&#xff1a; 需求&#xff1a;点击加号执行后端返回的script中的代码 后端返回的html&#xff1a; <!DOCTYPE html> <html langzh> <head> <title>xxx</title> <style>body{font-size: 14px}p{text-indent: 30px;}textarea{width…...

介绍maven生命周期-水温

Maven生命周期是指一系列的构建阶段&#xff0c;包括项目的清理、编译、测试、打包、部署等。Maven通过定义生命周期来规范项目构建过程&#xff0c;使得开发人员可以方便地执行一系列的构建任务。 Maven的生命周期分为三个阶段&#xff1a; clean生命周期&#xff1a;主要用…...

spring boot3.x快速入门

下一篇&#xff1a;Spring Boot 3.x gradle脚手架工程build.gradle详解 本教程将基于gradle项目构建工具来快速构建一个spring boot 3.x的最简单的web应用&#xff0c;其中涉及各种构建技巧和细节&#xff0c;希望能帮到初学者~ 文章目录 先决条件JDK17gradle全局配置 gradle项…...

JavaWeb之servlet关于Ajax实现前后端分离

一、什么是Ajax: AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 不是新的编程语言&#xff0c;而是一种使用现有标准的新方法。 AJAX 最大的优点是在不重新加载整个页面的情况下&#xff0c;可以与服务器交换数据并更新部…...

vue3表格组件formatter

有时候在网页上显示表格数据时&#xff0c;表格的某些列值只有有限数目&#xff08;例如&#xff0c;启用/停用&#xff09;&#xff0c;这时候后端常常使用不同的数据值表示不同状态&#xff0c;前端怎么将这些数据值转化为相应的列值呢&#xff1f; 我们可以采用vue3表格组件…...

C# 使用NHibernate连接MySQL实现数据的增删改查

使用 NHibernate 连接 MySQL 并实现数据的增删改查操作是一个非常典型的场景。以下是一个简单的示例&#xff0c;演示了如何配置 NHibernate 与 MySQL 连接并进行基本的 CRUD 操作。 目录 步骤 1: 安装必要的包 步骤 2: 配置 NHibernate 配置文件方式 代码方式 步骤 3: 定…...

IDEA2024.2重磅发布,更新完有4G!

JetBrains 今天宣布了其 IDE 家族版本之 2024.2 更新&#xff0c;其亮点是新 UI 现在已是默认设置&#xff0c;并且对 AI Assistant &#xff08;AI助手&#xff09;进行了几项改进。 安装密道 新 UI 的设计更加简约&#xff0c;可以根据需要以视觉方式扩展复杂功能。值得开发…...

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&#xff0c;全称是Qt Widgets for Technical…...

Netty高性能数据结构

文章目录 Netty高性能数据结构FastThreadLocalHashedWheelTimer时间轮Mpsc无锁队列 Netty高性能数据结构 Netty 用高性能数据结构的主要目的是为了提高网络通信的效率和系统的整体性能。 所谓的高性能数据结构是指&#xff0c;那些在特定场景下优化了性能和效率的数据结构&am…...

关于百度、微软语音合成的实现案例

关键词 自助机产品、排队呼叫功能、网络喇叭、百度语音合成SDK、微软TTS 阅读建议 对自助机产品功能扩展感兴趣的读者、需要实现远程语音呼叫功能的开发者、想要了解网络喇叭选型及其使用的技术人员、对百度语音合成SDK和微软TTS感兴趣的开发者 阅读时长 预计阅读时长&#xf…...

二叉树:镜像树,子结构,二叉树转链表,二叉树的倒数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&#xff0c;B&…...

瑞秋,詹妮弗·安妮斯顿多年来与本·阿弗莱克保持着“调情”友谊 又一个詹妮弗

尽管所有迹象都表明本阿弗莱克和詹妮弗洛佩兹的婚姻即将走向离婚,但他尚未公开评论此事。不过,好莱坞圈内人士已经纷纷将他与另一位名人联系起来。事实上,是另一位詹妮弗。 一位消息人士向媒体透露,詹妮弗安妮斯顿和阿弗莱克一直都很有默契——无论是在银幕上还是在银幕外…...

指纹失效,忘记iPhone屏幕解锁密码怎么应对?

为保证手机的安全及隐私&#xff0c;我们会给手机设置屏幕锁屏密码&#xff0c;通过输入设置密码来解锁手机屏幕锁&#xff0c;但为了给大家提供快速便捷的解锁方式&#xff0c;苹果公司提供了指纹解锁&#xff0c;不仅解锁更便捷了还极大地增强了设备的安全性。但有时我们手指…...

09.XSS跨站脚本攻击(超详细!!!)

1、什么是XSS XSS&#xff08;跨站脚本攻击&#xff09;&#xff1a;攻击者利用这个漏洞将恶意脚本注入到网页中&#xff0c;当其它用户浏览这些页面时&#xff0c;恶意脚本会在用户的浏览器中执行。XSS攻击允许攻击者在用户的浏览器上执行脚本&#xff0c;从而可能获取用户的…...

讲解人工智能在现代科技中的应用和未来发展趋势-水文

人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一种模拟人类智能的科技领域&#xff0c;它通过计算机模拟人类的思维、学习、推理和决策能力&#xff0c;以便解决复杂的问题。近年来&#xff0c;人工智能技术的发展取得了惊人的进展&#xff0c…...

2.2 QT 环境配置

2.2 QT环境配置 QT是一个1991年由QT Company开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序&#xff0c;也可以用于开发非GUI程序&#xff0c;比如控制台工具和服务器。Qt是面向对象的框架&#xff0c;使用特殊的代码生成扩展&#xff08;称为元对象编译器&…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...