学习笔记-JWT 保持登录状态

news2024/9/23 5:26:34

目录

一、解析 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")
    @ResponseBody
    public 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 

七、前后端拦截过程图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1976739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang是如何实现动态数组功能的?Slice切片原理解析

Hi 亲爱的朋友们,我是 k 哥。今天,咱们聊一聊Golang 切片。 当我们需要使用数组,但是又不能提前定义数组大小时,可以使用golang的动态数组结构,slice切片。在 Go 语言的众多特性里,slice 是我们经常用到的数…

基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 MSER 4.2 HOG特征提取 4.3 SVM 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2017b 3.部分核心程序 (完整版代码包含中…

黑马头条vue2.0项目实战(四)——首页—文章列表

目录 1. 头部导航栏 1.1 页面布局 1.2 样式调整中遇到的问题 2. 频道列表 2.1 页面布局 2.2 样式调整 2.3 展示频道列表 3. 文章列表 3.1 思路分析 3.2 使用 List 列表组件 3.3 加载文章列表数据 3.4 下拉刷新 3.5 设置上下padding固定头部和频道列表 3.6 记住列…

48天笔试训练错题——day40

目录 选择题 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 编程题 1. 发邮件 2. 最长上升子序列 选择题 1. DNS 劫持又称域名劫持,是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回…

大数据Flink(一百零七):阿里云Flink的应用场景

文章目录 阿里云Flink的应用场景 一、​​​​​​​背景信息 二、​​​​​​​​​​​​​​部门场景 三、​​​​​​​​​​​​​​技术领域 1、​​​​​​​​​​​​​​实时ETL和数据流 2、​​​​​​​​​​​​​​实时数据分析 3、​​​​​​​事…

8.3总结

1.改进渲染 这个渲染为了美观我做了很久花了好多时间,,, // 加载头像图像InputStream inputStream new ByteArrayInputStream(message.getFileBytes());Image image new Image(inputStream); // 第二个参数表示是否缓存图片,根…

达梦数据库dsc集群动态添加节点

前提条件:在安装好的的dsc集群:达梦数据库dsc集群保姆级部署文档_达梦数据库文档-CSDN博客上动态添加节点 1、环境信息 扩展节点信息: 操作环境:VMware Workstation 16 Pro dmdsc集群 机器ip 主机名 操作系统 资源配置 实…

mac中dyld[5999]: Library not loaded: libssl.3.dylib解决方法

需要重新安装下openssl3.0版本 brew reinstall openssl3.0 安装后执行还是报错,需要找到openssl的安装路径 /opt/homebrew/Cellar/openssl3.0/3.0.14/lib/ 将libssl.3.dylib和libcrypto.3.dylib拷贝到自己的二进制文件同目录下,再执行二进制文件就可…

YUM软件包管理工具:更改YUM源、配置本地YUM仓库

文章目录 YUM软件包管理工具更改YUM源配置过程网络出错,配置网卡 本地YUM仓库配置挂载配置本地yum源 YUM软件包管理工具 YUM(Yellowdog Updater, Modified)是一个在Linux系统中广泛使用的开源软件包管理工具,尤其常见于Fedora、R…

图论① dfs | Java | LeetCode 797,Kama 98 邻接表实现(未完成)

797 所有可能路径 https://leetcode.cn/problems/all-paths-from-source-to-target/description/ 输入&#xff1a;graph [[1,2],[3],[3],[]] 题目分析&#xff0c;这里 class Solution {//这个不是二维数组&#xff0c;而是listList<List<Integer>> res new Ar…

【Python系列】Python 字典合并

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【教学类-72-01】20240803建筑对称图纸01

背景需求 通义万相下载“对称建筑&#xff0c;简笔画” 我想把“对称建筑”做成对称的样式&#xff0c;类似《对称脸》 【教学类-36-12-01】20240302儿童对称正脸图&#xff08;一&#xff09;4图右脸4图左脸&#xff08;中班《幼儿园里朋友多》&#xff09;&#xff08;midj…

高等数学精解【4】

文章目录 平面方程直角坐标及基本运算 参考文献 平面方程 直角坐标及基本运算 向量的四则运算 下面由文心一言自动生成 向量的四则运算主要包括加法、减法、数乘&#xff08;标量乘法&#xff09;和数量积&#xff08;点积或内积&#xff09;&#xff0c;但通常不直接称为“除…

GuLi商城-商品服务-API-新增商品-获取分类关联的品牌

这个接口在上一篇文章中已经写过了&#xff0c;功能已经实现了&#xff0c;这里略

Vue3 核心模块源码解析

Vue3 核心模块源码解析 1、Vue3 模块源码解析1.1 compiler-core1.1.1 目录结构1.1.2 compile逻辑 1.2 reactivity1.2.1 目录结构1.2.2 reactivity逻辑 1.3 runtime-core1.3.1 目录结构1.3.2 runtime核心逻辑 1.4 runtime-dom1.4.1 主要功能 1.5 runtime-test1.5.1 目录结构1.5.…

深入理解接口测试:实用指南与最佳实践(一) 环境安装

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 这一阶段是接口测试的学习&#xff0c;我们接下来的讲解都是使用Postman这款工具&#xff0c;当然呢Postman是现在一款非常流行的接口调试工具&#xff0c;它使用简单&#xff0c;而且功能也很强大。不仅测试人员会使用…

【linux】【操作系统】内核之system_call.s源码阅读

system_call.s汇编代码是 Linux 内核的一部分&#xff0c;负责处理系统调用、定时器中断、硬盘中断、软盘中断和并行端口中断。下面是各个部分的详细说明&#xff1a; 系统调用处理 (_system_call) 功能 处理系统调用请求。根据传入的系统调用编号 (%eax) 调用相应的系统调用…

Linux修炼之路之进程地址空间

目录 一&#xff1a;程序地址空间 二&#xff1a;相关细节知识 接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗-----------林辞忧 一&#xff1a;程序地址空间 1.在学习c/c时&#xff0c;经常会听到堆区&#xff0c;栈区&#xff0c;代码段&#xff0c;常量…

IoTDB 入门教程 企业篇②——IoTDB-Workbench可视化控制台

文章目录 一、前文二、首页三、实例管理四、系统管理五、查询六、测点管理 一、前文 IoTDB入门教程——导读 IoTDB-Workbench同样是通过联系天谋科技商务&#xff0c;请求免费试用的。 请求试用激活启动的操作步骤&#xff0c;详情请见&#xff1a;IoTDB 入门教程 企业篇①——…

SQL注入实例(sqli-labs/less-4)

0、初始页面 1、确定闭合符号 前两条判断是否为数值型注入&#xff0c;后两条判断字符型注入的闭合符号 ?id1 and 11 ?id1 and 12 ?id1" ?id1") 2、确定表的列数 ?id1") order by 3 -- 3、确定回显位置 ?id-1") union select 1,2,3 -- 4、爆库…