Java 21使用JJWT 0.13.0的最新正确用法示例
基于 JJWT 0.13.0 API 的正确代码示例和 Ma ven 依赖。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

确认 Ma ven 依赖
动手之前,第一步永远是确认依赖。请务必检查你的 pom.xml,确保使用了正确的配置。从 JJWT 0.13.0 版本开始,库采用了更清晰的模块化架构,依赖项也相应拆分。
io.jsonwebtoken jjwt-api 0.13.0 io.jsonwebtoken jjwt-impl 0.13.0 runtime io.jsonwebtoken jjwt-jackson 0.13.0 runtime
这里有个关键点需要注意:根据公开的依赖更新日志,0.13.0 版本确实存在,但社区的主流文档和示例目前大多仍围绕更成熟的 0.11.x 系列。在 0.11.5 中,Jwts.parserBuilder() 就已经是官方推荐的标准用法了。如果你确定要使用 0.13.0,其核心 API 设计理念与 0.11.x 基本一致,但稳妥起见,强烈建议查阅其官方发布说明,以确认是否有任何细微但重要的变更。
使用新 API 的 JWT 工具类
理解了依赖,接下来就是实战。下面这个工具类示例,完全基于最新的 parserBuilder() 风格 API 构建,可以直接拿来参考或集成。
首先,是一个简单的配置类,用于集中管理 JWT 相关参数:
public class SecurityProperties {
private JwtConfig jwt = new JwtConfig();
/**
* JWT密钥 - 至少32字节(256位)用于HMAC-SHA算法
*/
private String secret;
/**
* JWT过期时间(秒)
*/
private Long expiration = 86400L;
/**
* JWT刷新过期时间(秒)
*/
private Long refreshExpiration = 604800L;
/**
* JWT签发者
*/
private String issuer = "you-system";
/**
* JWT受众
*/
private String audience = "you-client";
/**
* JWT令牌前缀
*/
private String tokenPrefix = "Bearer";
}
}
然后是核心的工具类,包含了令牌的生成与解析:
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import ja vax.crypto.SecretKey;
import ja va.util.Date;
import ja va.util.Map;
public class JwtUtil {
private final SecretKey secretKey;
private final long expirationMs;
public JwtUtil(SecretKey secretKey, long expirationMs) {
this.secretKey = secretKey;
this.expirationMs = expirationMs;
}
/**
* 生成JWT令牌
*
* @param subject 主题(如用户ID)
* @param claims 自定义声明(载荷)
* @return 生成的JWT字符串
*/
public String generateToken(String subject, Map claims) {
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
Date exp = new Date(nowMillis + expirationMs);
// 过期方法
// JwtBuilder builder = Jwts.builder()
// .setSubject(subject)
// .setIssuedAt(now)
// .setExpiration(exp)
// .signWith(secretKey); // 直接使用SecretKey对象
String refreshTokenIssuer = securityProperties.getJwt().getIssuer() + "-refresh";
// 替换方法
JwtBuilder builder = Jwts.builder().claims(claims)
.subject(subject)
.issuedAt(toDate(now))
.expiration(toDate(expirationTime))
.issuer(refreshTokenIssuer) // 设置刷新令牌签发者
.audience().add(securityProperties.getJwt().getAudience()).and() // 使用配置的受众
.signWith(getSecretKey(), Jwts.SIG.HS512); // 使用HS512算法签名
if (claims != null) {
builder.setClaims(claims);
}
// 压缩生成最终令牌
return builder.compact();
}
/**
* 解析并验证JWT令牌(使用新API Jwts.parserBuilder())
*
* @param token 待解析的JWT字符串
* @return 解析出的声明(Claims)
* @throws JwtException 如果令牌无效、过期或签名验证失败
*/
public Claims parseToken(String token) throws JwtException {
// 过时方法
// return Jwts.parserBuilder() // 使用新的parserBuilder
// .setSigningKey(secretKey) // 设置签名密钥
// .build() // 构建不可变的、线程安全的JwtParser实例
// .parseClaimsJws(token) // 解析并验证JWT
// .getBody(); // 获取载荷(Claims)
// 替换方法
return Jwts.parser()
.verifyWith(getSecretKey())
.build()
.parseSignedClaims(token)
.getPayload();
}
}
密钥生成与管理
安全是 JWT 的基石,而密钥管理则是安全的核心。上面的工具类使用了 ja vax.crypto.SecretKey 对象,那么如何安全地生成和保管它呢?JJWT 提供了非常便捷的工具类。
import io.jsonwebtoken.security.Keys;
import ja vax.crypto.SecretKey;
import ja va.util.Base64;
public class KeyGenerator {
public static void main(String[] args) {
// 为HS256算法生成一个安全的密钥 SignatureAlgorithm.HS256 过时替换 Jwts.SIG.HS512
SecretKey key = Keys.secretKeyFor(Jwts.SIG.HS512);
// 如果需要将密钥以字符串形式保存(如存储在配置文件中),可以编码为Base64
String base64Key = Base64.getEncoder().encodeToString(key.getEncoded());
System.out.println("Base64 encoded key: " + base64Key);
// 在应用启动时,可以从Base64字符串重新构造SecretKey
// byte[] decodedKey = Base64.getDecoder().decode(base64Key);
// SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "HmacSHA256");
}
}
这里必须敲一下黑板:在生产环境中,密钥绝不允许硬编码在源代码里。务必从安全的配置源获取,例如环境变量、专业的密钥管理服务(如 AWS KMS, HashiCorp Vault)或加密的配置文件。这是防止密钥泄露的生命线。
如何使用工具类
工具类和密钥都准备好了,怎么用呢?下面是一个完整的演示流程,从初始化到生成再到解析验证,一目了然。
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.security.Keys;
import ja vax.crypto.SecretKey;
import ja va.util.HashMap;
import ja va.util.Map;
public class Application {
public static void main(String[] args) {
// 1. 生成密钥(在实际应用中,这个密钥应该来自安全配置)
SecretKey secretKey = Keys.secretKeyFor(Jwts.SIG.HS512);
long expirationMs = 24 * 60 * 60 * 1000; // 24小时
// 2. 初始化JWT工具类
JwtUtil jwtUtil = new JwtUtil(secretKey, expirationMs);
// 3. 准备自定义声明
Map claims = new HashMap<>();
claims.put("userId", 1001);
claims.put("role", "admin");
// 4. 生成JWT令牌
String subject = "user123";
String jwtToken = jwtUtil.generateToken(subject, claims);
System.out.println("Generated JWT: " + jwtToken);
// 5. 解析和验证JWT令牌
try {
Claims parsedClaims = jwtUtil.parseToken(jwtToken);
System.out.println("Token subject: " + parsedClaims.getSubject());
System.out.println("User ID from token: " + parsedClaims.get("userId", Integer.class));
} catch (JwtException e) {
System.err.println("JWT validation failed: " + e.getMessage());
}
}
}
核心变更与总结
最后,我们来梳理一下这次升级或新上手需要把握的几个核心要点:
- API 设计更清晰:新的
JwtParser通过 Builder 模式构建,产生的实例是不可变且线程安全的,这符合现代 API 设计的最佳实践。 - 密钥安全升级:强烈推荐使用
io.jsonwebtoken.security.Keys工具类来生成强随机性的SecretKey对象,这比手动处理字符串密钥更安全、更规范。 - 依赖结构模块化:务必检查并正确配置你的依赖,确保同时引入了
jjwt-api(接口)、jjwt-impl(运行时实现)以及序列化支持(如jjwt-jackson)。
希望这份基于最新 API 的指南,能帮助你平滑地完成 JWT 相关的开发或升级工作。如果在密钥管理策略或具体的异常处理场景中遇到更深层次的问题,相关的社区讨论和官方文档总是最好的延伸阅读材料。
相关攻略
Ja va常用包解析:从核心到工具,构建高效开发基石 常用的包(熟悉) 包的名称和功能 说到Ja va编程,一个绕不开的话题就是它那庞大而有序的类库体系。这些类库被打包成一个个功能模块,也就是我们常说的“包”。掌握几个核心的包,就像是拿到了打开Ja va宝库的钥匙,能让你在开发时事半功倍。今天,我们
怎么在 Ja va 中使用 CyclicBarrier 实现多线程的阶段性同步 什么时候该用 CyclicBarrier 而不是 CountDownLatch 在并发编程中,选择正确的同步工具往往事半功倍。那么,CyclicBarrier 和 CountDownLatch 到底该怎么选?核心区别在于
怎么利用 ja va awt Robot 配合 delay() 方法实现模拟人工录入时的真实停顿感 用 ja va awt robot 模拟人工录入,核心目标从来不是追求“快”,而是要做到“像人”——真人打字有自然的节奏、有短暂的犹豫、有小停顿,偶尔还会回删修改。如果只是简单地使用 delay()
如何 on 在 Ja va 中利用 do-while 结合非阻塞 I O 实现针对低功耗设备的轮询式通讯 开门见山地说,想在 Ja va 里直接用 do-while 循环“实现”针对低功耗设备的非阻塞 I O 轮询通讯,这条路基本是走不通的。这并非语法或逻辑上的小障碍,而是源于 Ja va 平台本身
Ja va三元运算符? :适用于单条件判断且分支类型兼容的表达式场景,嵌套会降低可读性;应优先用于变量初始化、Stream映射等表达式上下文,多分支或复杂逻辑推荐if-else或switch。 在Ja va的世界里,三元运算符 ? : 就像一把精巧的瑞士军刀——它专为特定场景而生。它的核心价值,在于
热门专题
热门推荐
如何在Composer中配置自动更新周期 开门见山地说,Composer本身并不提供所谓的“自动更新周期”配置功能。 它没有内置任何定时检查或自动执行 composer update 的机制。所有你看到的关于设置自动更新的讨论,本质上都是通过外部调度工具(比如cron或者GitHub Actions
VSCode部署依赖插件和CLI工具,90%失败因本地CLI未安装、未登录或项目结构不符;Azure需Azure Account与Azure App Service双扩展并重启;Heroku需正确安装CLI、登录并配置Procfile;部署前须检查端口监听、启动文件及环境变量。 很多开发者习惯在VS
VSCode 能真正运行并调试 PowerShell 脚本的关键在于三步 想让 VSCode 顺畅地跑起 PowerShell 脚本,还能愉快地打断点调试?很多人第一步就错了——关键不在于你装没装那个 PowerShell 扩展,而在于背后三个环环相扣的配置:pwsh exe 或 powershel
iOS币安交易平台APP下载v3 0 5 苹果手机安装币安APP详细步骤 想在iPhone上使用币安进行交易,其实并不复杂。整个过程可以概括为几个核心步骤:首先通过币安官网下载iOS版APP;点击安装后等待应用图标出现在桌面;首次打开时若提示“未受信任的企业级开发者”,需进入“设置-通用-翻跟斗与设
净水器滤芯到底能不能清洗?揭秘常见使用误区与正确保养方法 许多小米净水器用户都曾有过这样的疑问:机器内部的滤芯是否可以拆解清洗,以延长使用寿命、节省更换成本?这里需要明确一个核心原则:净水器的核心过滤元件不支持用户自行拆解清洗,但整机系统确实配备了科学的自动冲洗与清洁程序,以维持其最佳性能。 从产品





