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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 带大家认识Java语法之泛型与通配符

    带大家认识Java语法之泛型与通配符

    使用泛型的目的是利用Java编译机制,在编译过程中帮我们检测代码中不规范的有可能导致程序错误的代码,下面这篇文章主要给大家介绍了关于Java泛型与通配符的相关资料,需要的朋友可以参考下
    2022-03-03
  • java 结合jQuery实现跨域名获取数据的方法

    java 结合jQuery实现跨域名获取数据的方法

    下面小编就为大家带来一篇java 结合jQuery实现跨域名获取数据的方法。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • 详解Java如何利用位操作符创建位掩码

    详解Java如何利用位操作符创建位掩码

    在本文中,我们来看看如何使用位操作符实现低级别的位掩码。我们将看到我们如何将一个单一的int变量作为一个单独的数据容器,感兴趣的可以跟随小编一起学习一下
    2022-10-10
  • 解读Map中的computeIfAbsent方法

    解读Map中的computeIfAbsent方法

    文章介绍了Java 8中Map接口的computeIfAbsent方法,该方法用于在Map中获取指定键的值,如果不存在则调用提供的函数计算值并放入Map中,并给出了使用示例
    2026-05-05
  • RecyclerChart动态属性图标联动数据动态加载详解

    RecyclerChart动态属性图标联动数据动态加载详解

    这篇文章主要为大家介绍了RecyclerChart动态属性图标联动数据动态加载详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • MyBatis Excutor 拦截器的巧妙用法

    MyBatis Excutor 拦截器的巧妙用法

    这里要讲的巧妙用法是用来实现在拦截器中执行额外 MyBatis 现有方法的用法,并提供了解决拦截Executor时想要修改MappedStatement时解决并发的问题。感兴趣的朋友一起看看吧
    2017-10-10
  • Java GC垃圾回收算法分析

    Java GC垃圾回收算法分析

    垃圾回收机制简称GC,主要用于Java堆的管理。在JVM中程序计数器、虚拟机栈、本地方法栈生命周期随跟随线程,栈帧的进栈和入栈能实现自动清理。而 jdk8后元空间为本地内存也不受GC控制,所以垃圾回收主要是在堆中
    2022-12-12
  • 详解用maven搭建springboot环境的方法

    详解用maven搭建springboot环境的方法

    本篇文章主要介绍了详解用maven搭建springboot环境的方法,这里整理了详细的代码,非常具有实用价值,有需要的小伙伴可以参考下
    2017-08-08
  • Java中StringBuilder与StringBuffer使用及源码解读

    Java中StringBuilder与StringBuffer使用及源码解读

    我们前面学习的String就属于不可变字符串,因为理论上一个String字符串一旦定义好,其内容就不可再被改变,但实际上,还有另一种可变字符串,包括StringBuilder和StringBuffer两个类,那可变字符串有什么特点,又怎么使用呢,接下来就请大家跟我一起来学习吧
    2023-05-05
  • 一文掌握JVM Safe Point

    一文掌握JVM Safe Point

    关于 Safe Point 是 JVM 中很关键的一个概念,但我估计有不少同学不是很懂,于是今天跟大家来深入聊聊 Safe Point,通过本文学习你会了解什么是 Safe Point?为啥需要 Safe Point?Safe Point 与 Stop the World 的关系?感兴趣的朋友一起看看吧
    2022-10-10

最新评论