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总线上&…...
Open3D 点云投影到圆柱(python详细过程版)
目录 一、算法原理1、圆柱方程2、投影原理二、代码实现三、结果展示1、原始点云2、投影结果四、参考链接一、算法原理 1、圆柱方程 圆柱方程可以表示为: ( x − x...
Unity实战(10):如何将某个相机的画面做成贴图(RenderTexture)
目录 前言 一、创建物体、材质与相机 二、将RenderTexture赋给材质 2.1 修改rt1的一些属性 2.2 将rtMat1材质的shader改为Unlit/Texture,并将rt1赋给这个材质 三、效果呈现 前言 本文记录如何将某个相机的画面做成贴图,即游戏某些场景中小地图做法…...
STL- 函数对象
1 函数对象 1.1 函数对象概念 概念: 重载函数调用操作符的类,其对象常称为函数对象函数对象使用重载的()时,行为类似函数调用,也叫仿函数 本质: 函数对象(仿函数)是一个类,不是一个函数 1.2 函数对象…...
前端 JS 经典:上传文件
重点:multipart/form-data 后端识别上传类型必填 1. form 表单上传 <!-- enctype"multipart/form-data" 这个必填 --> <form action"http://127.0.0.1:8080/users/avatar" method"post" enctype"multipart/form-data…...
数据分析面试
数据分析相关的职位面试可以拆解为以下三块: 1)技术基础 2)项目经验提问 3)业务问题 【数据分析与挖掘(二)】面试题汇总(附答案)_数据分析面试常见问题及答案_youthlost的博客-CSDN博客 我裸辞去面试p…...
Open3D(C++) 整体最小二乘拟合平面
目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。 一、算法原理 1、算法过程 最小二乘拟合平面认为点云数据系数矩阵不存在误差,然而由于观测条件的限制,观测向量、系数矩阵都有可能存在误差,那么最小二乘方法就不再是最…...
【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL源码分析
一、环境介绍 RK3588主板搭载Android12操作系统,内核是Linux5.10,使用ST的六轴传感器LSM6DSR芯片。 二、芯片介绍 LSM6DSR是一款加速度和角速度(陀螺仪)六轴传感器,还内置了一个温度传感器。该芯片可以选择I2C,SPI通讯,还有可编程终端,可以后置摄像头等设备,功能是很…...
MT8788安卓核心板详细参数_MTK安卓主板开发板智能通讯模块
MT8788安卓核心板集成了一个高效的12nm SoC,内置4G LTE调制解调器,将强大的硬件与到处可连接的全面功能设计相结合。 MTK8788智能终端具备许多功能,包括4G、2.4G/5G双频WiFi、蓝牙4.2BLE、2.5W功放、USB、mipi屏接口、三路摄像头接口、GPS和…...
C++String模拟实现
实际上string没什么可讲,主要是对string函数的运用与理解,与其写库函数如何用,不如直接去看c库函数来得好。 以下是自己实现string功能函数。但没对string库中的全部函数进行实现,而是实现主要使用的。 .cpp内是用来测试函数功能…...
Java 设置免登录请求接口被拦截问题
1、在设置免登录时,前端将请求的路由添加到白名单后,请求接口还是被拦截到了,将请求接口也设置后还是会被拦截跳转到登录页面 通过JAVA 注解 Anonymous 进行设置匿名访问就可以了...
美工网站/百家号关键词排名优化
「博客专家」申请及审核执行标准 博客等级,博客积分规则...
农业技术网站建设原则/免费发布信息
本文实例讲述了jQuery实现仿Alipay支付宝首页全屏焦点图切换特效。分享给大家供大家参考。具体实现方法如下:/p>"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">kinMaxShow 扩展效果body{ margin:0; padding:0;}#Login{ position:rela…...
石林彝族网站建设/cpc广告接单平台
下面我们讨论容器如何与外部世界通信。这里涉及两个方向: 容器访问外部世界 外部世界访问容器 容器访问外部世界 在我们当前的实验环境下,docker host 是可以访问外网的。 我们看一下容器是否也能访问外网呢? 可见,容器默认就能访问外网。 请…...
成都网站建设哪家专业/营销平台是什么意思
今天来说说软件测试工程师的面试吧。毕竟,面试,决定了你以后一段时间内的薪资待遇。 最近自己因为跟外包公司出现了些问题,让我非常不满,所以重新投了简历观望有没有合适的机会跳槽。 我才转行3个月,现在跳槽其实是非…...
单县菏泽网站建设/太原好的网站制作排名
运行时限为1s,这很常见,对于该时限,我们设计的算法复杂度不能超过百万级别,即不要超过一千万。假如你的算法时间复杂度为O(n^2),则n不应该大于3000 空间限制是32MB,即你程序中申请的内存不能超过32MB&#…...
个人网站设计主题/网络营销推广有效方式
Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。 三角形的行数…...