[SpringBoot] JWT令牌——登录校验

news2024/11/24 17:16:50

JWT(JSON Web Token)是一种用于在网络应用之间传递信息的开放标准(RFC 7519)。它由三部分组成:头部(header)、载荷(payload)和签名(signature)。JWT令牌通常用于在用户和服务器之间进行身份验证和授权。

JWT令牌的工作流程如下:

  1. 用户通过用户名和密码进行登录操作,服务器验证用户身份后(即登录成功)会生成一个JWT令牌。
  2. 服务器将JWT令牌返回给用户,用户将其存储在本地。
  3. 用户在后续的任何请求中都会将JWT令牌发送给服务器。
  4. 服务器验证JWT令牌的签名和有效期,并根据载荷中的信息进行相应的操作。

JWT令牌的优点包括:

  • 简单轻量:JWT令牌是基于JSON格式的,易于传输和解析。
  • 安全性:JWT令牌使用签名进行验证,可以防止篡改和伪造。
  • 无状态性:JWT令牌包含了所有必要的信息,服务器无需保存用户的会话状态

1.添加令牌依赖

要想使用JWT令牌,需要在pom.xml 文件中添加对应的依赖

2.定义令牌生成和解析方法

如果用户进行登录操作,登录成功后,服务器会调用令牌生成方法,给用户生成一个令牌,然后将令牌返回给用户端,用户端就会把令牌存储到本地,之后用户发送任何请求都会在请求体中携带令牌。而用户发起的任何请求都会被服务器的过滤器所拦截,在过滤器中校验令牌的真假,如果令牌正确,则放行用户的请求,如果令牌错误,则返回给用户端提示信息

2.1 定义令牌工具类

生成一个 JWT令牌需要设置令牌的加密算法、密钥、有效时期,也可以在令牌中添加一些自定义的内容,而自定义的内容会被添加到令牌的载荷(payload)部分里

所以我们定义两个静态变量。第一个变量设置密钥,第一个变量设置有效时期

2.2 定义令牌生成方法

定义一个方法用来生成令牌,我们自定义的内容可以通过参数传递到方法中,然后在方法中设置令牌所需要的东西,最后该方法返回一个字符串的 JWT令牌

2.3定义令牌解析方法

令牌解析是用于校验令牌的真假性。在用户进行任何操作之前,会先验证令牌的真假,只有令牌为真,才能继续操作

校验令牌需要我们把之前生成的令牌作为参数传进去,还需要设置生成令牌时所用的密钥,最后该方法返回的是令牌的载荷(payload)部分,所就是我们自定义的内容

3.在登录功能中调用令牌生成方法

只有用户登录成功后,才会生成令牌,如果用户登录失败,则会提示失败信息

当服务端接收到登录请求后,先获取用户登录时所输入的账号和密码,封装到用户实体类中。然后调用业务层中的方法,查询该账号密码是否在数据库中存在,如果存在则证明用户输入的账号密码正确

然后可以定义一个集合,将用户的信息添加到集合里面

然后调用令牌生成方法,将集合作为参数传进去,最终集合里的信息会被添加到令牌的载荷(payload)部分里面

最后将令牌添加到返回体中,返回给用户端一个成功的JSON 数据。如果登录失败,则最后返回给用户端一个失败的JSON 数据

4.定义过滤器

服务器给用户生成令牌之后,往后用户所有的请求中都会在请求体中携带令牌。而用户发起的请求都会被过滤器所拦截,在过滤器中校验令牌的真假和令牌的有效期,如果通过校验,则放行用户的请求

定义一个过滤器,实现 Filter 接口,并在注解上添加拦截所有路径请求,重新 Filter 接口里的一个放行方法

然后还需要在启动类上添加一个注解

@ServletComponentScan

用于扫描我们定义的过滤器类

5.定义令牌校验条件

在过滤器中,定义一些令牌的校验条件,如果条件全都满足,则校验通过,放行用户的请求。如果校验失败,则返回失败的响应体

5.1 转换数据类型

先把请求和响应分别转换成

HttpServletRequest 类型
HttpServletResponse 类型

2.获取请求的url

判断 url 中是否包含 login 路径,如果包含,则证明该请求是用户登录请求,因为在登录之前还没有生成令牌,所有直接放行

3.获取请求头中的令牌

如果令牌为空,则返回给用户端错误的 JSON 数据

如果令牌不为空,则校验令牌的正确性,需要调用令牌工具类中解析令牌的方法,如果解析失败,则抛异常,返回给用户端错误的 JSON 数据

如果解析正确,则放行

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

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

相关文章

android 去除桌面谷歌搜索框

注: 本文只是博主学习记录分享,仅供参考。如有错误请指出来,谢谢! 一、问题描述 去除 android 系统桌面谷歌搜索栏,前后对比如下图: 系统版本:android12 平台:rk3568 二、…

DNS域名系统 | unbound

目录 DNS 命名空间和域名结构 DNS的命名空间的结构: 域名服务器的分类: ​编辑 DNS 资源记录 常见type: DNS报文结构 请求报文: 响应报文: 解析类型 递归查询 迭代查询 DNS劫持 DNS劫持方法: 防御措施 DNS服务部署…

【Java EE】 文件IO的使用以及流操作

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

C++:const成员和取地址操作符

目录 一、const成员 二、取地址及const取地址操作符重载 一、const成员 将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数 隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。 注&…

【JAVA】PO、VO、DAO、BO、DTO、POJO你分得清吗?

在Java开发中,PO、VO、DAO、BO、DTO、POJO这些词汇是比较常见的,每个术语都有其特定的含义和用途。下面是它们的具体区别: 名称简要概况用途和特定PO (Persistence Object) 持…

PDF 书签制作与调整 从可编辑、不可编辑 PDF 文档创建书签的方法

本文是对以前发表的旧文拆分,因为原文主题太多,过长,特另起一篇分述。 第一部分 由可编辑 PDF 文档创建书签 方法 1. Adobe Acrobat Pro autobookmark AutoBookmark 是一个可用于 Adobe Acrobat 自动生成书签的插件。 官方下载地址&…

手拉手安装Kafka2.13发送和消费消息

Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 Kafka启动方式有Zookeeper和Kraft,两种方式只能选择其中一种启动,不能同时使用。 Kafka下载https://downloads.apache.org/kafka/3.7.0/kafka_2.…

静态链接lib库使用

lib库实际上分为两种,一种是静态链接lib库或者叫做静态lib库,另一种叫做动态链接库dll库的lib导入库或称为lib导入库。这两个库是不一样的,很多人都分不清楚,很容易混淆。 第一种是静态lib,包含了所有的代码实现的&am…

回归预测 | Matlab实现SSA-ESN基于麻雀搜索算法优化回声状态网络的多输入单输出回归预测

回归预测 | Matlab实现SSA-ESN基于麻雀搜索算法优化回声状态网络的多输入单输出回归预测 目录 回归预测 | Matlab实现SSA-ESN基于麻雀搜索算法优化回声状态网络的多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-ESN基于麻雀搜索算法…

2024/4/26 C++day4

1在Complex类的基础上&#xff0c;完成^&#xff0c;>>&#xff0c;<<,~运算符的重载 #include <iostream> using namespace std; class Complex {int rel; //实部int vir; //虚部 public:Complex(){}Complex(int rel,int vir):rel(rel),vir(vir){}vo…

小程序中如何快速给分类添加商品

​快速在分类下面上传商品&#xff0c;并且能够设置商品顺序&#xff0c;关系到运营效率的高低。下面就具体介绍如何快速在某个分类下面设置商品。 一、在商品管理处&#xff0c;查询某个分类下面的商品。 进入小程序管理员后台->商品管理&#xff0c;点击分类输入框&…

【汇编语言】直接定址表

【汇编语言】直接定址表 文章目录 【汇编语言】直接定址表前言一、移位指令移位指令过程逻辑移位指令shl 和 shr 二、操作显存数据显示的原理显示缓冲区的结构显示信息的一种“直接”方式 三、描述内存单元的标号关于标号去了冒号的数据标号数据标号同时描述内存地址和单元长度…

css:echarts渐变色转换为css渐变色

通过一个下拉框来选择渐变类型&#xff0c;为了简化&#xff0c;我设置了三种&#xff1a;水平方向的渐变、垂直方向的渐变和径向渐变用&#xff0c;表格来配置echarts渐变色的百分比位置和颜色。 config是表格里的数据格式如下&#xff1a; offset是百分比位置&#xff0c;co…

2024北京车展来了!自主品牌成“流量担当”!

时隔四年&#xff0c;2024北京国际车展重磅回归&#xff01; 4月25日&#xff0c;2024&#xff08;第十八届&#xff09;北京国际汽车展览会&#xff08;以下简称“北京车展”&#xff09;正式开幕&#xff0c;本次车展以“新时代 新汽车”为主题。作为今年国内首个国际A级车展…

Centos/linux根目录扩容、分区、挂载。LVM、物理卷、逻辑卷

前言    &#xff08;空格&#xff09; &#xff1a;分区挂载和扩容是两码事 每个Linux使用者在安装Linux时都会遇到这样的困境&#xff1a;在为系统分区时&#xff0c;如何精确评估和分配各个硬盘分区的容量&#xff0c;因为系统管理员不但要考虑到当前某个分区需要的容量&a…

使用 Godot 游戏引擎为 Apple 的 visionOS 创建游戏和应用的平台

借助GodotVision ,您可以使用Godot 游戏引擎为 Apple VisionOS创建游戏和应用程序。 保卫牛城堡,一款使用 GodotVision 制作的 VisionOS 游戏 GodotVision 运行一个控制本机RealityKit 视图的无头 Godot实例。粗略地说:Godot 是后端,

C++面向对象程序设计 - 派生类的构造函数和析构函数

构造函数的主要作用对数据成员初始化&#xff0c;基类的构造函数是不能被继承的&#xff0c;在声明派生类时&#xff0c;派生类并没有把类的构造函数继承下来。因此&#xff0c;对继承过来的基类成员初始化的工作也要由派生类的构造函数完成&#xff1b;所以在派生类中不仅要考…

OSPF的LSA与特殊区域

Area区域概念 *一个区域维护一张LSDB&#xff0c;路由器详细的链路信息只在这个区域内传播 不是每一台路由器都需要了解所有外部目的地的详细信息 *OSPF网络的层次化设计 通过区域ID标识 骨干&#xff08; Backbone &#xff09;区域&#xff0c;必须是area 0(骨干区域…

JVM(Jvm如何管理空间?对象如何存储、管理?)

Jvm如何管理空间&#xff08;Java运行时数据区域与分配空间的方式&#xff09; ⭐运行时数据区域 程序计数器 程序计数器&#xff08;PC&#xff09;&#xff0c;是一块较小的内存空。它可以看作是当前线程所执行的字节码的行号指示器。Java虚拟机的多线程是通过时间片轮转调…

milvus对象存储和消息中间件的工厂设计模式分析

milvus对象存储和消息中间件的工厂设计模式分析 需求 根据参数设置创建mq和storage mq有kafka,pulsar storage有local,minio,remote 配置文件 根据配置文件选择初始化mq和存储: mq:type: pulsarcommon:storageType: minio对于这种类型一个是mq&#xff0c;一个是存储&…