当前位置: 首页
编程语言
Java 21使用JJWT 0.13.0的最新正确用法示例

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

热心网友 时间: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。

同类文章
更多
VSCode配置DockerCompose_多容器编排文件的语法自动补全

VSCode配置DockerCompose_多容器编排文件的语法自动补全

Docker Compose YAML 无语义补全是因为未绑定官方 Schema 先明确一个核心问题:Docker Compose 的 YAML 文件默认没有语义级补全,必须靠插件 + Schema 绑定才能实现字段级提示。这就像你有一本功能强大的字典,但没告诉编辑器怎么查,结果就是打不出想要的词。

时间:2026-05-03 20:20
Sublime如何快速打开项目文件?Sublime强大的Goto Anything功能详解

Sublime如何快速打开项目文件?Sublime强大的Goto Anything功能详解

Sublime如何快速打开项目文件?Sublime强大的Goto Anything功能详解 说到Sublime Text的高效,Goto Anything功能不是“能用”,而是必须开箱即用。只要项目索引构建完毕,按下 Ctrl+P(Windows Linux)或 Cmd+P(macOS),瞬间就能定

时间:2026-05-03 20:20
Sublime怎么配置TailwindCSS Sublime安装智能感应插件【手册】

Sublime怎么配置TailwindCSS Sublime安装智能感应插件【手册】

Sublime Text 无法原生支持 Tailwind CSS 智能提示,必须安装 Tailwind CSS IntelliSense(bradlc 版)插件,并确保 tailwind config js 在项目根目录、content 字段显式包含扩展名、正确配置 additional_synta

时间:2026-05-03 20:19
Sublime怎么实现代码自动补全 Sublime增强IntelliSense感应【攻略】

Sublime怎么实现代码自动补全 Sublime增强IntelliSense感应【攻略】

Sublime原生无IntelliSense,必须通过LSP插件桥接本地语言服务器实现;默认auto_complete仅前缀匹配、不解析AST或import,无法提供函数签名、类型推导等语义补全。 直白点说,Sublime Text 本身并不自带 IntelliSense 那种“智能感知”能力。它默

时间:2026-05-03 20:19
Sublime怎么配置Nginx配置文件 Sublime语法高亮效果设置【手册】

Sublime怎么配置Nginx配置文件 Sublime语法高亮效果设置【手册】

Sublime Text 配置Nginx语法高亮:从“灰蒙蒙”到精准识别的实战手册 打开Sublime Text,新建一个 conf文件,敲下server、location ~*这些Nginx指令,结果发现全是清一色的灰色?别急着怀疑插件装错了,问题很可能出在语法绑定上。Sublime Text默认

时间:2026-05-03 20:19
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程