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总线上&…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...