现代Java开发:使用jjwt实现JWT认证

前言

jjwt 库 是一个流行的 Java 库,用于创建和解析 JWT。我在学习spring security 的过程中看到了很多关于jwt的教程,其中最流行的就是使用jjwt实现jwt认证,但是教程之中依然使用的旧版的jjwt库,许多的类与方法已经标记弃用或者是已经被删除了,新版 jjwt 增加了许多新特性和改进,使得生成和验证 JWT 更加方便,故写此文以作记忆。

附上我的博客链接:现代Java开发:使用jjwt实现JWT认证

环境:

  • jjwt 0.12.5
  • jdk17+
  • Maven
  • Spring Boot 3.3.1

JWT的相关知识

JSON Web Token (JWT) 是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于在各方之间以 JSON 对象的形式安全地传输信息。由于这些信息是经过数字签名的,因此可以被验证和信任。

JWT 的结构

JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),这三部分用点 (.) 分隔。

  1. 头部(Header): 头部通常包括两部分:令牌的类型(JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)。

    {"alg": "HS256","typ": "JWT"
    }
    

    这部分会进行 Base64Url 编码,形成 JWT 的第一部分。

  2. 载荷(Payload): 载荷部分包含声明(Claims),声明是有关实体(通常是用户)和其他数据的声明。有三种类型的声明:注册声明(Registered claims)、公共声明(Public claims)和私有声明(Private claims)。

    例如:

    {"sub": "1234567890","name": "zfmx","iat": 1516239022
    }
    

    这部分也会进行 Base64Url 编码,形成 JWT 的第二部分。

  3. 签名(Signature): 签名部分用于验证消息在传输过程中是否未被篡改。需要将编码后的头部和载荷用点 (.) 连接在一起,然后使用指定的签名算法(如 HMAC SHA256)和一个密钥对其进行签名。签名的结果是 JWT 的第三部分。

编写JWT工具

引入jjwt库

首先要做的就是把jjwt引入到项目之中

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

写本文时最新的库应该是0.12.6,但是在引入过程中jjwt-jackson的坐标定位失败,故采用了0.12.5。

定义属性

这里有两个属性需要定义:

  • 有效时间:public static final Long JWT_TTL
  • 加密密钥:public static final String JWT_KEY

加密方法

传入subject、ttlMillis、uuid生成tooken。

hmacShaKeyFor 方法生成的密钥可以用于 JWT 的签名和验证。

currentTimeMillis 方法生成时间戳

Jwts类构建一个jwt构建器返回

 /*** 生成JWT* @param subject 用户信息 json格式* @param ttlMillis 有效时间* @param uuid 自定义uuid* @return JWT令牌*/
private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid){SecretKey secretKey = Keys.hmacShaKeyFor(JwtUtil.JWT_KEY.getBytes(StandardCharsets.UTF_8));long nowMillis = System.currentTimeMillis();    // 当前时间戳Date now = new Date(nowMillis);                 // 当前时间if(ttlMillis == null){ttlMillis = JwtUtil.JWT_TTL;}long expMillis = nowMillis + ttlMillis;     // 过期时间戳Date exp = new Date(expMillis);             // 过期时间return Jwts.builder().id(uuid).subject(subject).issuer("zfmx").issuedAt(now).signWith(secretKey).expiration(exp);
}

值得注意的是,原本的setId、setSubject等方法已经在新版jjwt中废弃,这里采用的是新版的写法

生成token

注意这里的getUUID为自己实现的生成uuid方法,重载createJWT方法来适应多种应用情况

/*** 生成JWT* @param subject 用户信息 json格式* @return JWT令牌*/
public static String createJWT(String subject){JwtBuilder jwtBuilder = getJwtBuilder(subject, null, getUUID());return jwtBuilder.compact();
}/*** 生成JWT* @param subject 用户信息 json格式* @param ttlMillis 有效时间* @return JWT令牌*/
public static String createJWT(String subject, Long ttlMillis){JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());return builder.compact();
}/*** 生成JWT* @param id 自定义uuid* @param subject 用户信息 json格式* @param ttlMillis 有效时间* @return JWT令牌*/
public static String createJWT(String id,String subject,Long ttlMillis){JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);return builder.compact();
}// 生成uuid
public static String getUUID(){return UUID.randomUUID().toString().replaceAll("-","");
}

解码方法

/*** 解析JWT* @param jwt JWT令牌* @return Claims* @throws Exception 解析异常*/
public static Claims parseJWT(String jwt) throws Exception{SecretKey secretKey = Keys.hmacShaKeyFor(JwtUtil.JWT_KEY.getBytes());return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(jwt).getPayload();
}

这里的parser()\parseSignedClaims()等方法都是新版的使用方法。

浅浅测试一下吧

public static void main(String[] args) throws Exception {var token = createJWT("{'name':'zhangsan','age':18}");Claims claims = parseJWT(token);System.out.println(claims);
}

result

参考

JSON Web 令牌 - 维基百科 — JSON Web Token - Wikipedia

JJWT最新版本0.12.x使用指南,实现登陆功能,JwtUtils_jjwt 0.12-CSDN博客

jjwt/CHANGELOG.md at master · jwtk/jjwt (github.com)

SpringSecurity-从入门到精通-三更草堂 - 起跑线小言 - 博客园 (cnblogs.com)

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

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

相关文章

多家隧道代理价格:阿布云、快代理、小象代理、熊猫代理和亿牛云……

随着奥运的热度攀升&#xff0c;各大品牌也在抓紧时机赶上这波奥运热潮&#xff0c;随之而来的大量数据信息收集和分析工作也接踵而至&#xff0c;在这一数据采集过程中&#xff0c;HTTP代理的质量和价格对企业的效率和成本调控重要性不言而喻。我们大部分人在日常购买产品的时…

Revit中如何添加剖面?快速实现剖面图的方法汇总

Revit中创建剖面以及剖面视图一般有两种方法&#xff0c;一是使用Revit原生的剖面功能&#xff0c;而是使用Revit插件BIM建模助手进行便捷的剖面操作以及剖面视图创建。 Revit原生的剖面功能&#xff0c;点击后可以自由拉伸剖面方向、范围&#xff0c;放置完剖面符号后&#xf…

【ROS 最简单教程 003/300】ROS 快速体验:Hello World

开始自己的第一次尝试叭 ~ Hello World 本篇是 C 版本&#xff0c;如需 python 版本 &#x1f449; python 版本指路 ROS 中程序的实现流程&#xff1a; 创建工作空间 ( &#x1f499; 如 tutu_ws) &#xff0c;进入并编译 mkdir -p tutu_ws/src cd tutu_ws catkin_make在 src …

【C语言】结构体详解 -《探索C语言的 “小宇宙” 》

目录 C语言结构体&#xff08;struct&#xff09;详解结构体概览表1. 结构体的基本概念1.1 结构体定义1.2 结构体变量声明 2. 结构体成员的访问2.1 使用点运算符&#xff08;.&#xff09;访问成员输出 2.2 使用箭头运算符&#xff08;->&#xff09;访问成员输出 3. 结构体…

springboot使用Gateway做网关并且配置全局拦截器

一、为什么要用网关 统一入口&#xff1a; 作用&#xff1a;作为所有客户端请求的统一入口。说明&#xff1a;所有客户端请求都通过网关进行路由&#xff0c;网关负责将请求转发到后端的微服务 路由转发&#xff1a; 作用&#xff1a;根据请求的URL、方法等信息将请求路由到…

Hive之扩展函数(UDF)

Hive之扩展函数(UDF) 1、概念讲解 当所提供的函数无法解决遇到的问题时&#xff0c;我们通常会进行自定义函数&#xff0c;即&#xff1a;扩展函数。Hive的扩展函数可分为三种&#xff1a;UDF,UDTF,UDAF。 UDF&#xff1a;一进一出 UDTF&#xff1a;一进多出 UDAF&#xff1a…

作业帮6-19笔试-选填题

可以看到10在第一位&#xff0c;说明用的是挖坑法快速排序&#xff0c;过程如下&#xff1a; 右指针从最右边开始&#xff0c;找到第一个比30小的数10&#xff0c;与30交换。 10、15、40、28、50、30、70 左指针从位置1开始&#xff0c;找到40&#xff0c;与30互换。 10、15、3…

C语言 ——— 函数指针的定义 函数指针的使用

目录 何为函数指针 打印 函数名的地址 及 &函数名的地址 函数指针的代码&#xff08;如何正确存储函数地址&#xff09; 函数指针的使用 何为函数指针 类比&#xff1a; 整型指针 - 指向整型数据的指针&#xff0c;整型指针存放的是整型数据的地址 字符指针 - 指向字…

Lc63---1859将句子排序(排序)---Java版(未写完)

1.题目描述 2.思路 &#xff08;1&#xff09;首先将句子按空格分割成若干单词。 &#xff08;2&#xff09;每个单词的最后一个字符是它的位置索引。我们可以通过这个索引将单词恢复到正确的位置。 &#xff08;3&#xff09;按照单词的索引顺序排序这些单词。 &#xff08;4…

分布式搜索引擎ES--Elasticsearch集群

1.Elasticsearch集群的概念 分片机制&#xff1a;每个索引都可以被分片 索引my_doc只有一个主分片&#xff1b;索引shop有三个主分片&#xff1b;索引shop2有5个主分片;(参考前面案例) 每个主分片都包含索引的数据&#xff0c;由于目前是单机&#xff0c;所以副分片是没有的&a…

shardingsphere的学习(二):sharingjdbc操作读写分离

简介 mysql配置读写分离以及使用shardingjdbc配置操作读写分离 读写分离 主数据库负责增删改操作&#xff08;写&#xff09;&#xff0c;从数据库负责查询操作&#xff08;读&#xff09;&#xff0c;主数据库和从数据库之间会数据同步&#xff08;主从复制&#xff09;。 …

【前端】一文带你了解 CSS

文章目录 1. CSS 是什么2. CSS 引入方式2.1 内部样式2.2 外部样式2.3 内联样式 3. CSS 常见选择器3.1 基础选择器3.1.1 标签选择器3.1.2 类选择器3.1.3 id 选择器3.1.4 通配符选择器 3.2 复合选择器3.2.1 后代选择器 4. CSS 常用属性4.1 字体相关4.2 文本相关4.3 背景相关4.4 设…

敢不敢跟我一起搭建一个Agent!不写一行代码,10分钟搞出你的智能体!纯配置也能真正掌握AI最有潜力的技术?AI圈内人必备技能

说一千道一万&#xff0c;不如实地转一转。学了那么久的AI Agent的概念了&#xff0c;是时候该落地一个Agent看看自己的掌握程度了对不对&#xff0c;我们都理解大脑是自动节能的&#xff0c;但是知识的确需要倒逼自己一把才能真的掌握&#xff0c;不瞒大家说&#xff0c;笔者对…

论文阅读:面向自动驾驶场景的多目标点云检测算法

论文地址:面向自动驾驶场景的多目标点云检测算法 概要 点云在自动驾驶系统中的三维目标检测是关键技术之一。目前主流的基于体素的无锚框检测算法通常采用复杂的二阶段修正模块,虽然在算法性能上有所提升,但往往伴随着较大的延迟。单阶段无锚框点云检测算法简化了检测流程,…

日程管理多源归一,服务场景一键直达

时间对于每个人来说都是非常宝贵的&#xff0c;曾经我们使用台历、挂历来标记和查看重要日程&#xff0c;通过翻页来见证时光的流逝&#xff0c;随着信息化时代的不断发展&#xff0c;更加灵活简洁的电子日历成为主流&#xff0c;日历也从一个最简单的日期看板&#xff0c;慢慢…

正余弦算法作者又提出新算法!徒步优化算法(HOA)-2024年一区顶刊新算法-公式原理详解与性能测评 Matlab代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 算法伪代码 性能测评 参考文献 …

ruoyi vue3版本web端隐藏侧边栏及其顶部导航栏

做项目时有个需求是在web端里面嵌入一个页面全屏的大屏&#xff0c;但若依web自带的侧边栏导航和顶部导航一时还不知道怎么隐藏起来&#xff0c;于是在网上到处查找资料&#xff0c;终于&#xff0c;还是在若依的gitee文档中发现了线索 怎么隐藏侧边栏和顶部导航栏实现完全的全…

从数据时代到智能时代,星环科技信雅达联合发布金融全栈解决方案

近年来&#xff0c;星环科技与信雅达在金融行业的多个关键领域展开了广泛而深入的合作&#xff0c;推出了一系列面向金融科技领域的联合解决方案。此次合作基于星环科技在大数据、人工智能和云计算领域的先进技术&#xff0c;以及信雅达在金融领域的深厚积累&#xff0c;围绕数…