首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
Java 21使用JJWT 0.13.0的最新正确用法示例

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

热心网友
11
转载
2026-05-03

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

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

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

确认 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 相关的开发或升级工作。如果在密钥管理策略或具体的异常处理场景中遇到更深层次的问题,相关的社区讨论和官方文档总是最好的延伸阅读材料。

来源:https://www.jb51.net/program/3624142fy.htm
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

java常用的包
编程语言
java常用的包

Ja va常用包解析:从核心到工具,构建高效开发基石 常用的包(熟悉) 包的名称和功能 说到Ja va编程,一个绕不开的话题就是它那庞大而有序的类库体系。这些类库被打包成一个个功能模块,也就是我们常说的“包”。掌握几个核心的包,就像是拿到了打开Ja va宝库的钥匙,能让你在开发时事半功倍。今天,我们

热心网友
05.03
怎么在 Java 中使用 CyclicBarrier 实现多线程的阶段性同步
编程语言
怎么在 Java 中使用 CyclicBarrier 实现多线程的阶段性同步

怎么在 Ja va 中使用 CyclicBarrier 实现多线程的阶段性同步 什么时候该用 CyclicBarrier 而不是 CountDownLatch 在并发编程中,选择正确的同步工具往往事半功倍。那么,CyclicBarrier 和 CountDownLatch 到底该怎么选?核心区别在于

热心网友
05.03
怎么利用 java.awt.Robot 配合 delay() 方法实现模拟人工录入时的真实停顿感
编程语言
怎么利用 java.awt.Robot 配合 delay() 方法实现模拟人工录入时的真实停顿感

怎么利用 ja va awt Robot 配合 delay() 方法实现模拟人工录入时的真实停顿感 用 ja va awt robot 模拟人工录入,核心目标从来不是追求“快”,而是要做到“像人”——真人打字有自然的节奏、有短暂的犹豫、有小停顿,偶尔还会回删修改。如果只是简单地使用 delay()

热心网友
05.03
如何 on 在 Java 中利用 do-while 结合非阻塞 I/O 实现针对低功耗设备的轮询式通讯
编程语言
如何 on 在 Java 中利用 do-while 结合非阻塞 I/O 实现针对低功耗设备的轮询式通讯

如何 on 在 Ja va 中利用 do-while 结合非阻塞 I O 实现针对低功耗设备的轮询式通讯 开门见山地说,想在 Ja va 里直接用 do-while 循环“实现”针对低功耗设备的非阻塞 I O 轮询通讯,这条路基本是走不通的。这并非语法或逻辑上的小障碍,而是源于 Ja va 平台本身

热心网友
05.03
如何在 Java 中利用三元运算符 ? : 简化简单的赋值逻辑并理解其在嵌套使用时的可读性挑战
编程语言
如何在 Java 中利用三元运算符 ? : 简化简单的赋值逻辑并理解其在嵌套使用时的可读性挑战

Ja va三元运算符? :适用于单条件判断且分支类型兼容的表达式场景,嵌套会降低可读性;应优先用于变量初始化、Stream映射等表达式上下文,多分支或复杂逻辑推荐if-else或switch。 在Ja va的世界里,三元运算符 ? : 就像一把精巧的瑞士军刀——它专为特定场景而生。它的核心价值,在于

热心网友
05.03

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

如何在Composer中配置自动更新周期
编程语言
如何在Composer中配置自动更新周期

如何在Composer中配置自动更新周期 开门见山地说,Composer本身并不提供所谓的“自动更新周期”配置功能。 它没有内置任何定时检查或自动执行 composer update 的机制。所有你看到的关于设置自动更新的讨论,本质上都是通过外部调度工具(比如cron或者GitHub Actions

热心网友
05.03
VSCode如何部署应用到云平台_VSCode部署应用到云平台要点
编程语言
VSCode如何部署应用到云平台_VSCode部署应用到云平台要点

VSCode部署依赖插件和CLI工具,90%失败因本地CLI未安装、未登录或项目结构不符;Azure需Azure Account与Azure App Service双扩展并重启;Heroku需正确安装CLI、登录并配置Procfile;部署前须检查端口监听、启动文件及环境变量。 很多开发者习惯在VS

热心网友
05.03
VSCode配置PowerShell环境_Windows脚本编写效率提升方案
编程语言
VSCode配置PowerShell环境_Windows脚本编写效率提升方案

VSCode 能真正运行并调试 PowerShell 脚本的关键在于三步 想让 VSCode 顺畅地跑起 PowerShell 脚本,还能愉快地打断点调试?很多人第一步就错了——关键不在于你装没装那个 PowerShell 扩展,而在于背后三个环环相扣的配置:pwsh exe 或 powershel

热心网友
05.03
iOS币安交易平台APP下载v3.0.5 苹果手机安装币安APP详细步骤
web3.0
iOS币安交易平台APP下载v3.0.5 苹果手机安装币安APP详细步骤

iOS币安交易平台APP下载v3 0 5 苹果手机安装币安APP详细步骤 想在iPhone上使用币安进行交易,其实并不复杂。整个过程可以概括为几个核心步骤:首先通过币安官网下载iOS版APP;点击安装后等待应用图标出现在桌面;首次打开时若提示“未受信任的企业级开发者”,需进入“设置-通用-翻跟斗与设

热心网友
05.03
小米净水器滤芯能清洗吗
电脑教程
小米净水器滤芯能清洗吗

净水器滤芯到底能不能清洗?揭秘常见使用误区与正确保养方法 许多小米净水器用户都曾有过这样的疑问:机器内部的滤芯是否可以拆解清洗,以延长使用寿命、节省更换成本?这里需要明确一个核心原则:净水器的核心过滤元件不支持用户自行拆解清洗,但整机系统确实配备了科学的自动冲洗与清洁程序,以维持其最佳性能。 从产品

热心网友
05.03