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

相关文章:
Springboot整合JWT完成验证登录
目录 一、引入依赖二、JwtUtil 代码解读三、LoginController 代码解读四、整体代码五、结果展示 一、引入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></depende…...
centos7 下使用docker安装常见的软件:Redis
关于docker的基础知识,请见《别在说自己不知道docker了,全文通俗易懂的给你说明白docker的基础与底层原理》 在自己学习的过程中经常会需要动手安装一下常见的工具,本篇就手把手带你用docker安装一遍。 jdk安装 如果先要更换之前的jdk从第…...
sql:SQL优化知识点记录(十五)
(1)MySQL主从复制 我们这里配置一Windows上的MySql做主机,Linux上的MySql做从机,搭建一主一从 测试以下是否能够拼通:从Linux上:167,连接Windows的165 从Windows的165 连接Linux上:…...
vue3+ts 分享海报
安装依赖1. npm install html2canvas --save<div class"flex-box"><div><div v-for"(item,index ) in from.list" :key"index" click"actvieFuntion(index)"><div>{{item}}</div><div :class"…...
Ubuntu23.10将推出全磁盘加密功能,提高系统安全性
Canonical 宣布其即将推出的 Ubuntu 23.10(Mantic Minotaur)将引入基于 TPM 的全磁盘加密的初步支持。这个特性将利用系统可信平台模块(TPM),在系统级别上进行全磁盘加密,从而提高系统的安全性。 但需要注…...
防火墙的设置主要是为了防范什么
防火墙的设置主要是为了防范网络攻击和数据泄露。随着互联网的普及和信息化的加速,网络安全问题越来越受到人们的关注。其中,防火墙是一种常见的网络安全设备,其设置的重要性也日益凸显。 防火墙的设置主要是为了防范什么 防火墙的设置主要目…...
Vim9和其他软件的文本复制、粘贴
大家都知道:在Vim9中使用y和p命令来进行文本的复制和粘贴,今天我来说一说Vim和其他软件之间的文本复制、粘贴操作。 Vim9和其他软件进行复制、粘贴,其原理就是通过系统剪贴板作为中介来执行操作。 一、从Vim9复制文本内容 按住鼠标左键滑出…...
MySQL学习5:事务、存储引擎
事务 简介 事务是一组数据库操作的执行单元,它要么完全执行,要么完全不执行。事务是确保数据库中的数据一致性和完整性的重要机制之一。 事务具有以下四个特性(称为ACID特性): 原子性(Atomicity…...
redis如何保证接口的幂等性
背景 如何防止接口中同样的数据提交,以及如何保证消息不被重复消费,这些都是shigen在学习的过程中遇到的问题。今天,趁着在学习redis的间隙,我写了一篇文章进行简单的实现。 注意:仅使用于单机的场景,对于…...
避坑之路 —— 前后端 json 的注意问题
当我们在进行开发项目的时候,在前后端需要进行数据之间的传输,那么就会需要到json。而json算是字符串中的一种 1.先说一下前端的, 其实这两种都是表示前端希望能收到后端json这样的数据格式,那么我们在后端就需要注意将数据进行转换为json进…...
[构建 Vue 组件库] 小尾巴 UI 组件库 —— 横向商品卡片(仿淘宝)
文章归档于:https://www.yuque.com/u27599042/row3c6 组件库地址 npm:https://www.npmjs.com/package/xwb-ui?activeTabreadmegitee:https://gitee.com/tongchaowei/xwb-ui 下载 npm i xwb-ui配置 按需导入 import {组件名 } from xwb-…...
【Python】Python实现五子棋游戏(带可视化界面)【独一无二】
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…...
用Maloja创建音乐收听统计数据
什么是 Maloja ? Maloja 是简单的自托管音乐记录数据库,用于创建个人收听统计数据。没有推荐,没有社交网络,没有废话。Maloja 是一个跟踪您一段时间内的收听习惯的工具。 官方演示站点:https://maloja.krateng.ch/ 导出…...
GRU门控循环单元
GRU 视频链接 https://www.bilibili.com/video/BV1Pk4y177Xg?p23&spm_id_frompageDriver&vd_source3b42b36e44d271f58e90f86679d77db7Zt—更新门 Rt—重置门 控制保存之前一层信息多,还是保留当前神经元得到的隐藏层的信息多。 Bi-GRU GRU比LSTM参数少 …...
使用Puppeteer构建博客内容的自动标签生成器
导语 标签是一种用于描述和分类博客内容的元数据,它可以帮助读者快速找到感兴趣的主题,也可以提高博客的搜索引擎优化(SEO)。然而,手动为每篇博客文章添加合适的标签是一件费时费力的工作,有时候也容易遗漏…...
大数据分析案例-基于随机森林算法构建二手房价格预测模型
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
SLAM从入门到精通(ROS安装)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 ROS科研上面用的多,实际生产其实用的也不少。它本身还是很好的应用框架。当然,它对于很多初学的同学来说还是很友好的。学完…...
Linux 下spi设备驱动
参考: Linux kernel 有关 spi 设备树参数解析 Linux kernel 有关 spi 设备树参数解析 - 走看看 Linux SPI驱动框架(1)——核心层 Linux SPI驱动框架(1)——核心层_linux spi驱动模型_绍兴小贵宁的博客-CSDN博客 Linux SPI驱动框架(2)——控制器驱动层 Linux SPI驱…...
一:图形的位置和尺寸测量
绘制的基本要素: onDraw(Canvas):是用来重写的 Canvas:实际执行绘制的 Paint:调整粗细和颜色等 坐标系:以屏幕左上角为原点,向右、向下为正向数值的坐标系 尺寸单位:在绘制过程中所有的尺寸单位都是px…...
rtthread下基于spi device架构MCP25625驱动
1.CAN驱动架构 由于采用了RTT的spi device架构,不能再随心所遇的编写CAN驱动 了,之前内核虽然采用了RTT内核,但是驱动并没有严格严格按RTT推荐的架构来做,这次不同了,上次是因为4个MCP25625挂在了4路独立的SPI总线上&…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
