Springboot整合JWT完成验证登录

目录

  • 一、引入依赖
  • 二、JwtUtil 代码解读
  • 三、LoginController 代码解读
  • 四、整体代码
  • 五、结果展示

一、引入依赖

 		<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>

二、JwtUtil 代码解读

这个Java类是一个工具类,用于生成和验证JSON Web Tokens(JWT)。JWT是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。这个信息可以被验证和信任,因为它是数字签名的。在这个例子中,使用了Java的jsonwebtoken库。

下面是对这个类每行代码的详细解释:

  1. import io.jsonwebtoken.*;:引入jsonwebtoken库的所有类。
  2. import java.util.Date;:引入java.util包下的Date类,用于处理日期和时间。
  3. import java.util.HashMap;:引入java.util包下的HashMap类,用于创建哈希映射。
  4. import java.util.Map;:引入java.util包下的Map接口,用于创建映射。
  5. public class JwtUtil {:声明一个公共类JwtUtil。
  6. private static final String SECRET_KEY = "your-secret-key";:在类中声明一个私有的、静态的、不可变的字符串变量SECRET_KEY,并初始化为"your-secret-key"。这个密钥用于JWT的签名和验证。
  7. public static String generateToken(String username) {:声明一个公共的、静态的方法generateToken,接收一个字符串参数username,并返回一个字符串。这个方法用于生成JWT。
  8. Map<String, Object> claims = new HashMap<>();:创建一个新的HashMap,用于存储JWT的载荷(claims)。
  9. claims.put("username", username);:将username添加到载荷中,键是"username",值是传递给generateToken方法的username参数。
  10. return Jwts.builder():使用Jwts类的builder方法开始构建一个新的JWT。
  11. .setClaims(claims):设置JWT的载荷。
  12. .setExpiration(new Date(System.currentTimeMillis() + 3600000)):设置JWT的过期时间。这里设置为当前时间之后的1小时(3600000毫秒)。
  13. .signWith(SignatureAlgorithm.HS256, SECRET_KEY):使用HS256算法和上面定义的SECRET_KEY对JWT进行签名。
  14. .compact();:生成JWT的字符串表示形式并返回。
  15. public static boolean validateToken(String token) {:声明一个公共的、静态的方法validateToken,接收一个字符串参数token,并返回一个布尔值。这个方法用于验证JWT。
  16. try {:开始一个try块,用于捕获可能出现的异常。
  17. Jwts.parser():使用Jwts类的parser方法开始解析JWT。
  18. .setSigningKey(SECRET_KEY):设置用于解析JWT的签名密钥。
  19. .parseClaimsJws(token):解析JWT,得到一个ClaimsJws对象。
  20. .getBody();:获取JWT的载荷。如果没有异常抛出,那么JWT是有效的,所以返回true。
  21. } catch (ExpiredJwtException e) {:捕获过期的JWT异常,返回false。
  22. } catch (UnsupportedJwtException e) {:捕获不支持的JWT类型异常,返回false。
  23. } catch (MalformedJwtException e) {:捕获格式错误的JWT异常,返回false。
  24. } catch (SignatureException e) {:捕获签名验证失败的JWT异常,返回false。
  25. } catch (IllegalArgumentException e) {:捕获其他非法情况的异常,返回false。
  26. }:结束try-catch块。
  27. }:结束validateToken方法。
  28. }:结束JwtUtil类。

三、LoginController 代码解读

这是一个使用Java语言和Spring框架编写的简单的登录控制器。下面是对这段代码的详细解释:

  • import com.minster.yanapi.common.ApiResponse;:导入名为ApiResponse的类,它可能是一个用于封装API响应的通用类,可能包含成功或失败的消息、状态码等信息。
  • import com.minster.yanapi.common.ResponseCode;:导入名为ResponseCode的枚举或类,可能包含API响应的状态码(例如,成功、失败、无效凭据等)。
  • import org.springframework.web.bind.annotation.*;:导入Spring MVC框架的注解,这些注解用于定义Web请求的处理方法。
  • @RestController:这是Spring MVC的注解,它表示该类是一个REST控制器。Spring会将此类中的方法返回的对象直接转化为JSON或XML等格式的响应数据。
  • @RequestMapping("/hello"):这是Spring MVC的注解,它定义了该控制器处理的基础URL路径。在这种情况下,所有路由都将以/hello开始。
  • public class LoginController {:定义了一个公开的类LoginController
  • @PostMapping("/login"):这是Spring MVC的注解,它定义了一个处理方法,该方法将处理向/hello/login路径发送的POST请求。
  • public ApiResponse login(@RequestParam("username") String username, @RequestParam("password") String password) {:定义了一个公开的方法login,它接收两个参数,分别是用户名和密码。这两个参数是通过POST请求中的参数提供的。这个方法返回一个ApiResponse对象。
  • if ("admin".equals(username) && "password".equals(password)) {:这是一个简单的验证过程,只检查用户名是否为"admin",密码是否为"password"。在真实的应用中,你应该连接数据库或其他数据源来验证凭据。
  • String token = JwtUtil.generateToken(username);:如果验证成功,它将生成一个JWT(JSON Web Token)并将其赋值给token变量。
  • return ApiResponse.success(token);:返回一个成功的ApiResponse,其中可能包含生成的JWT。
  • return ApiResponse.failed(ResponseCode.Invalid_credentials);:如果验证失败,返回一个失败的ApiResponse,并携带一个表示无效凭据的状态码。
  • }:结束login方法。
  • }:结束LoginController类。

四、整体代码


import io.jsonwebtoken.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class JwtUtil {private static final String SECRET_KEY = "your-secret-key"; // 替换为你自己的密钥public static String generateToken(String username) {Map<String, Object> claims = new HashMap<>();claims.put("username", username);return Jwts.builder().setClaims(claims).setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 设置过期时间为1小时.signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();}public static boolean validateToken(String token) {try {Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();return true;} catch (ExpiredJwtException e) {return false; // 标记为过期的JWT} catch (UnsupportedJwtException e) {return false; // 不支持的JWT类型} catch (MalformedJwtException e) {return false; // 格式错误的JWT} catch (SignatureException e) {return false; // 签名验证失败的JWT} catch (IllegalArgumentException e) {return false; // 其他非法情况}}
}
import com.minster.yanapi.common.ApiResponse;
import com.minster.yanapi.common.ResponseCode;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/hello")
public class LoginController {@PostMapping("/login")public ApiResponse login(@RequestParam("username") String username, @RequestParam("password") String password) {// 在这里进行用户名和密码的验证,这里只是简单示例,实际情况下需要连接数据库等进行验证if ("admin".equals(username) && "password".equals(password)) { // 假设用户名为"admin",密码为"password"时验证通过String token = JwtUtil.generateToken(username); // 生成JWT并返回给客户端return ApiResponse.success(token);} else {return ApiResponse.failed(ResponseCode.Invalid_credentials); // 返回错误信息给客户端,表示验证失败}}
}

五、结果展示

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-table 实现表、表格行、表格列合并

最近写vue开发项目的时候&#xff0c;很多地方用到了Element组件中的Table 表格。经过一周的边学边做&#xff0c;我总结了以下三种有关表格的合并方法。 一、合并表头 话不多说&#xff0c;先看效果图 代码如下&#xff1a; 表格结构如上&#xff0c;其中:header-cell-style对…

233062C++QTday5

实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#xff1a;半…

自动化测试框架unittest与pytest的区别!

引言   前面文章已经介绍了python单元测试框架&#xff0c;大家平时经常使用的是unittest&#xff0c;因为它比较基础&#xff0c;并且可以进行二次开发&#xff0c;如果你的开发水平很高&#xff0c;集成开发自动化测试平台也是可以的。而这篇文章主要讲unittest与pytest的区…

QQ 逻辑漏洞可执行文件 漏洞复现

本文由掌控安全学院- wax 投稿 首先拿到QQ的版本&#xff0c;目前可测试版本包括QQ最新版本&#xff0c;TIM最新版本 新创建一个bat文件&#xff08;这个可以随意&#xff0c;上马的也可以&#xff0c;exe也可以&#xff09; &#xff0c;本次测试内容如下首先向你的手机端发一…

对接西部数据Western Digital EDI 系统

近期我们为国内某知名电子产品企业提供EDI解决方案&#xff0c;采用知行之桥 EDI 系统作为核心组件&#xff0c;成功与西部数据Western Digital&#xff08;简称西数&#xff09;建立EDI连接&#xff0c;实现数据安全且自动化传输。 EDI实施需求 EDI连接 传输协议&#xff1a;A…

数据结构 排序

目录 第八章 排序8.1排序的基本概念1. 概念2. 排序算法的分类 8.2 插入排序8.2.1 直接插入排序8.2.2 算法效率分析8.2.2 折半插入排序总结8.2.3 希尔排序 8.3 交换排序8.3.1冒泡排序8.3.2快速排序&#xff08;了解栈的过程&#xff09; 8.4 选择排序8.4.1 简单选择排序8.4.2 堆…

小工具之视频抽帧

视频抽帧工具&#xff0c;所有视频所在目录以及抽帧图片保存路径 单个视频抽帧操作步骤&#xff1a; 选择文件路径->选择保存路径->拖动跳帧间隔->点击抽取帧 批量视频抽帧操作步骤&#xff1a; 选择文件夹路径->选择保存路径->拖动跳帧间隔->点击抽取帧 imp…

iview label-in-value 和 @on-change 的使用

在select加上label-in-value 之后&#xff0c;就可以调用通过on-change默认的方法&#xff0c;获取到value和label的值了 <Select v-model"params.area" placeholder"选择区县" label-in-value clearable style"width: 102px"><Option…

pip和conda的环境管理,二者到底应该如何使用

关于pip与conda是否能混用的问题&#xff0c;Anaconda官方早就给出了回答 先说结论&#xff0c;如果conda和pip在相同环境下掺杂使用&#xff0c;尤其是频繁使用这两个工具进行包的安装&#xff0c;可能会导致环境状态混乱 就像其他包管理器一样&#xff0c;大部分这些问题均…

mysql在ubuntu上命令行登陆密码不正确

1.登陆提示如下 2.使用mysql -u root -p登录也是类似的 3.打开宝塔面板 点击root密码&#xff0c;更改密码后即可在命令行界面登录 4.登录效果如下

深度学习环境搭建——之Anaconda3安装配置

序言&#xff1a; 工作中一直从事的是FPGA嵌入式开发&#xff0c;图像处理相关的工作。目前随着AI的浪潮&#xff0c;也被动卷入到深度学习的漩涡中&#xff0c;为了不被漩涡卷入深渊&#xff0c;只能自学些深度学习相关的知识&#xff0c;俗话说“好记性不如烂笔头”何况已经…

profinet是什么?

profinet是什么&#xff1f; 参考&#xff1a;一文读懂Profibus、Profinet、Ethernet的区别 PROFINETPROFIbusetherNET&#xff0c;把Profibus的主从结构移植到以太网上&#xff0c;所以profinet会有Controller和Device&#xff0c;他们的关系可以简单的对应于profibus的Maste…

【C++】构造函数意义 ( 构造函数显式调用与隐式调用 | 构造函数替代方案 - 初始化函数 | 初始化函数缺陷 | 默认构造函数 )

文章目录 一、构造函数意义1、类的构造函数2、构造函数显式调用与隐式调用3、构造函数替代方案 - 初始化函数4、初始化函数缺陷5、默认构造函数6、代码示例 - 初始化函数无法及时调用 一、构造函数意义 1、类的构造函数 C 提供的 构造函数 和 析构函数 作为 类实例对象的 初始化…

长短期记忆网络(LSTM)

概念 三个门&#xff1a;遗忘门、输入门、输出门 候选记忆单元 记忆单元 隐状态 ot 控制是否让输出&#xff0c;是否要进行重置。 总结 代码实现 import torch from torch import nn from d2l import torch as d2lbatch_size,num_steps 32,35 train_iter,vocab d2l.load_…

Linux中安装MySQL_图解_2023新

1.卸载 为了避免不必要的错误发生,先将原有的文件包进行查询并卸载 // 查询 rpm -qa | grep mysql rpm -qa | grep mari// 卸载 rpm -e 文件名 --nodeps2.将安装包上传到指定文件夹中 这里采用的是Xftp 3.将安装包进行解压 tar -zxvf 文件名 -C 解压路径4.获取解压的全路…

day55:C++ day5,运算符重载剩余部分、静态成员、继承

#include <iostream> #include <cstring> #define pi 3.14 using namespace std;class Shape { protected:double round;double area; public://无参构造Shape():round(40),area(100){cout<<"Shape::无参构造函数&#xff0c;默认周长为40&#xff0c;面…

sql 时间函数

1&#xff0c;前提 今天看同事写的sql里面出现了时间类的函数&#xff0c;平时自己也经常用到&#xff0c;每次都要百度&#xff0c;还不如自己整理记录在一起&#xff0c;方便后续使用。 2&#xff0c;sql时间函数 2.1 获取当前时间&#xff1a; selectNOW() as 当前日期时…

docker 部署 node.js(express) 服务

1、在 express 项目根目录下新增 Dockerfile 文件&#xff0c;内容如下&#xff1a; 创建服务容器的方法&#xff0c;可以根据自己的情况选择&#xff1a; 1、以下示例为宿主机没有安装 node 环境的写法&#xff1b; 2、先在本地构建包含 node 和 express 的基础镜像&#xff0…

JavaScript中的事件捕获(event capturing)和事件冒泡(event bubbling)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 事件捕获和事件冒泡⭐ 事件捕获&#xff08;Event Capturing&#xff09;示例&#xff1a; ⭐ 事件冒泡&#xff08;Event Bubbling&#xff09;示例&#xff1a; ⭐ 应用场景⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开…

计算机组成与设计硬件软件接口学习1

计算机的算术运算 子字并行 &#xff08;大致浏览&#xff09;pdf 170页左右 浮点加法不满足结合律&#xff1a; 适用于整型数据类型的并行执行策略并不适用于浮点数据类型 &#xff0c;原因如上↑ 处理器 流水线 流水线是一种能使多条指令重叠执行的实现技术 流水线技术通…