Java 21使用JJWT 0.13.0的最新正确用法示例

 更新时间:2026年04月19日 10:16:50   作者:小杍随笔  
JJWT(Java JWT)是Java平台上相当流行的用于生成Json Web Token的库,其更新速度非常快,导致网上许多教程在如今看来都已经过时,这篇文章主要介绍了Java 21使用JJWT 0.13.0的最新正确用法,需要的朋友可以参考下

基于 JJWT 0.13.0 API 的正确代码示例和 Maven 依赖。

确认 Maven 依赖

首先,请确保你的 pom.xml 中使用了正确的依赖配置。从 JJWT 0.13.0 版本开始,库采用了模块化架构。

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.13.0</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <version>0.13.0</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
            <version>0.13.0</version>
            <scope>runtime</scope>
        </dependency>

重要提示:根据我查到的信息,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 javax.crypto.SecretKey;
import java.util.Date;
import java.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<String, Object> 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();
    }
}

密钥生成与管理

在上述工具类中,我们使用了 javax.crypto.SecretKey 对象。你可以使用 JJWT 提供的便捷工具类来生成安全的密钥:

import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;
import java.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");
    }
}

安全提醒:生产环境中,密钥必须妥善保管,严禁硬编码在代码中。建议从安全的配置源(如环境变量、密钥管理服务)获取。

如何使用工具类

初始化工具类并生成、解析令牌的示例:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;
import java.util.HashMap;
import java.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<String, Object> 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());
        }
    }
}

核心变更与总结

  • 主要变更:新的 JwtParser 实例是不可变且线程安全的。
  • 密钥安全:推荐使用 io.jsonwebtoken.security.Keys 工具类生成安全的 SecretKey 对象,而不是直接使用字符串。
  • 依赖模块化:确保你的依赖配置正确,引入了 jjwt-apijjwt-impljjwt-jackson(或 jjwt-gson)。

希望这个基于最新 API 的示例能帮助你顺利完成升级!如果你在密钥管理或者异常处理方面有更多疑问,我很乐意提供进一步的信息。

到此这篇关于Java 21使用JWT 0.13.0最新正确用法的文章就介绍到这了,更多相关Java21使用JWT0.13.0内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入了解MyBatis分页机制

    深入了解MyBatis分页机制

    在企业项目的数据库操作中,分页查询是一个常见需求,尤其当数据量庞大时,MyBatis作为我们Java开发者的持久层框架,为分页提供了灵活的支持,本篇文章我们将深入探讨MyBatis的分页机制,使我们在实际开发项目中运用自如,需要的朋友可以参考下
    2023-12-12
  • SpringBoot异步任务使用方法详解

    SpringBoot异步任务使用方法详解

    这篇文章主要介绍了SpringBoot异步任务使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java哈希表的概念及实现完整代码

    Java哈希表的概念及实现完整代码

    这篇文章主要介绍了Java哈希表的概念及实现的相关资料,哈希表是一种高效查找数据的结构,通过哈希函数将关键字映射到数组的索引位置,当发生冲突时,可以通过闭散列或开散列(链地址法)来解决,需要的朋友可以参考下
    2024-11-11
  • Jenkins自动部署SpringBoot项目实践教程

    Jenkins自动部署SpringBoot项目实践教程

    这篇文章主要介绍了Jenkins自动部署SpringBoot项目实践教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring基于注解配置AOP详解

    Spring基于注解配置AOP详解

    这篇文章主要介绍了Spring基于注解配置AOP详解,Spring 的 AOP 功能是基于 AspectJ 实现的,支持使用注解声明式定义 AOP 切面,Spring 基于注解配置 AOP 需要启用 AspectJ 自动代理功能,需要的朋友可以参考下
    2023-09-09
  • spring MVC实践需要注意的地方

    spring MVC实践需要注意的地方

    这篇文章主要介绍了spring MVC实践需要注意的地方,帮助大家更好的理解和学习使用spring MVC,感兴趣的朋友可以了解下
    2021-03-03
  • Java的jps命令简介及使用示例详解

    Java的jps命令简介及使用示例详解

    jps是jdk提供的一个查看当前java进程的小工具, 可以看做是JavaVirtual Machine Process Status Tool的缩写,非常简单实用,本文重点给大家介绍下Java的jps命令使用,感兴趣的朋友一起看看吧
    2022-03-03
  • java对图片进行压缩和resize缩放的方法

    java对图片进行压缩和resize缩放的方法

    本篇文章主要介绍了java对图片进行压缩和resize调整的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Java中快速排序优化技巧之随机取样、三数取中和插入排序

    Java中快速排序优化技巧之随机取样、三数取中和插入排序

    快速排序是一种常用的基于比较的排序算法,下面这篇文章主要给大家介绍了关于Java中快速排序优化技巧之随机取样、三数取中和插入排序的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • java中进程与线程_三种实现方式总结(必看篇)

    java中进程与线程_三种实现方式总结(必看篇)

    下面小编就为大家带来一篇java中进程与线程_三种实现方式总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论