Springboot整合JWT完成验证登录

2023-11-10

一、引入依赖

 		<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); // 返回错误信息给客户端,表示验证失败
        }
    }
}

五、结果展示

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot整合JWT完成验证登录 的相关文章

随机推荐

  • CTracker

    https github com pjl1995 CTracker 本机可以跑 jacke121 CTracker master 可视化 demo show py 效果不是特别好 论文地址 https arxiv org pdf 2007
  • Python 生成随机各类字符串

    Python 生成随机各类字符串 Python 生成随机字符串 包括字符和数字组合 大写字符串 小写字符串 参数 字符数量 数字数量 def random stringdigit letter count digit count str1
  • 软件测试之从0到1完成UI自动化测试框架搭建系列(3)

    上节 我们讲了下 如何运用uiautomator2 atx pytest进行自动化的单元测试 这节 我们再思考下 如果我们每条用例 都去一步一步 先元素定位 然后写操作 然后写各种方法 那这个代码量是不是就有点偏多了 另外也不方便维护 比如
  • win10操作系统jdk11不带jre的解决办法、单/多版本jdk环境变量的配置、javac不可用的解决方法

    目录 win10操作系统jdk11不带jre的解决办法 两个java版本的jdk环境变量的配置 只有一个java版本时只需设置以下变量 怎么解决javac不可用的问题 win10操作系统jdk11不带jre的解决办法 在开始菜单中寻找命令提
  • 时钟抖动(Jitter)的基本概念

    随着通信系统中的时钟速率迈入GHz级 抖动这个在模拟设计中十分关键的因素 也开始在数字设计领域中日益得到人们的重视 在高速系统中 时钟或振荡器波形的时序误差会限制一个数字I O接口的最大速率 不仅如此 它还会导致通信链路的误码率增大 甚至限
  • android五大布局之LinearLayout

    初次接触android的同学 最先接触的也就是android的布局了 因为android的代码与界面是分开的 因此想要界面显示什么 布局应该是第一步 就像一个孩子生下来你要给他穿衣服一样 因此 我们现在所写的布局就是你看到项目运行的界面 L
  • MATLAB 快速傅里叶变换(fft)结果为什么是复数?

    文章核心是两部分 1 从直观和本质的角度 说明为什么快速傅里叶变换的结果是复数 2 详细说明了MATLAB中fft函数的运用方法 并给出了fft幅度谱的求解代码 但要真正了解快速傅里叶变换 核心是理解 FFT的计算原理 目录 一 直观解释
  • MySQL和SQLite的区别

    简单来说 SQLITE功能简约 小型化 追求最大磁盘效率 MYSQL功能全面 综合化 追求最大并发效率 如果只是单机上用的 数据量不是很大 需要方便移植或者需要频繁读 写磁盘文件的话 就用SQLite比较合适 如果是要满足多用户同时访问 或
  • Self-Attention和CNN的优雅集成,清华大学等提出ACmix,性能速度全面提升

    清华大学等提出了一个混合模型ACmix 它既兼顾Self Attention和Convolution的优点 同时与Convolution或Self Attention对应的模型相比 具有更小的计算开销 实验表明 本文方法在图像识别和下游任务
  • 因果关系的判断?

    最简单的方法是从相关性 先后顺序 排除干扰因素三个方面下手 简化版 1 两件事 A与B 相互关联 Association 2 A的发生可以预测B的发生 Prediction 3 排除其他可能的混淆变量 Excluding Confoundi
  • HTTP协议的理解

    目录 简介 HTTP URL HTTP请求 HTTP请求状态行 HTTP请求头 HTTP协议详解 HTTP的五大特点 非持久连接和持久连接 HTTP和HTTPS HTTP的不足 HTTPS介绍 简介 HTTP协议 超文本传输协议HyperT
  • 人工智能之产生式系统(c++实现)

    这次的人工智能实验是产生式系统 动物分类 规则库 R1 动物有毛发 哺乳类 R2 动物有奶 哺乳类 R3 动物有羽毛 鸟类 R4 动物会飞 会下蛋 鸟类 R5 哺乳类 动物吃肉 食肉动物 R6 动物有犬齿 有爪 眼盯前方 食肉动物 R7 哺
  • .NET 数据类型转换 方法

    using Newtonsoft Json using Newtonsoft Json Converters using System Web Script Serialization
  • 4-2 数据结构--二分搜索

    描述 给定一个由 n 个整数组成的序列 S 和一个由不同的 q 个整数组成的序列 T 编写一个程序 输出 C 即既在序列 T 中也在集合 S 中的整数个数 输入 在第一行中给出了 n 在第二行中 给出了 n 个整数 在第三行中给出了 q 然
  • 经典 55道 MySQL面试题及答案

    前言 MySQL面试题以及答案整理 最新版 MySQL高级面试题大全 发现网上很多MySQL面试题都没有答案 所以花了很长时间搜集 本套MySQL面试题大全 汇总了大量经典的MySQL程序员面试题以及答案 包含MySQL语言常见面试题 My
  • JAVA调用WebService的三种方法

    这两天一直在做外系统对接 对方的接口是webservice的形式 调用起来有些蛋疼 于是在这里记录一下我尝试过的调用WebService的三种方式 方式一 以HttpURLConnection的方式调用 String url http 12
  • 论文阅读笔记(conflux):Scaling Nakamoto Consensus to Thousands of Transactions per Second / arXiv 2018

    内容目录 概要 背景及介绍 conflux 实验结果 贡献 conflux框架 共识协议 安全性分析 conflux 共识算法 1 共识算法 2 假设和参数 3 正确性 实现 块头 Gossip Network 旧块检测 引导节点 原文链接
  • 亲密关系沟通-【认识需求】找到长期沟通的主方向

    亲密关系中短期问题 冲突 争吵 协商 聊天 长期问题 习惯 模式 环境 信念 长期部分 为什么提出需求会形成上海 安全感为什么不足以支撑这次沟通 长期问题 不能通过一次沟通就解决 长期问题是一个反复练习的结果 亲密关系是用来解决问题的 亲密
  • 2023年网络安全比赛--Windows渗透测试中职组(超详细)

    一 竞赛时间 180分钟 共计3小时 二 竞赛阶段 1 通过本地PC中渗透测试平台Kali对服务器场景20221219win进行系统服务及版本扫描渗透测试 并将该操作显示结果中1433端口对应的服务版本信息作为Flag值 例如3 1 450
  • Springboot整合JWT完成验证登录

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