最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2026年04月19日 10:16:50   作者:小杍隨筆  
JJWT(Java JWT)是Java平臺(tái)上相當(dāng)流行的用于生成Json Web Token的庫(kù),其更新速度非常快,導(dǎo)致網(wǎng)上許多教程在如今看來都已經(jīng)過時(shí),這篇文章主要介紹了Java?21使用JJWT?0.13.0的最新正確用法,需要的朋友可以參考下

基于 JJWT 0.13.0 API 的正確代碼示例和 Maven 依賴。

確認(rèn) Maven 依賴

首先,請(qǐng)確保你的 pom.xml 中使用了正確的依賴配置。從 JJWT 0.13.0 版本開始,庫(kù)采用了模塊化架構(gòu)。

        <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>

重要提示:根據(jù)我查到的信息,0.13.0 版本相關(guān)信息出現(xiàn)在一個(gè)依賴更新日志中,但主流的文檔和示例大多圍繞 0.11.x 版本展開。在 0.11.5 版本中,Jwts.parserBuilder() 已是官方推薦的用法。如果你確實(shí)需要使用 0.13.0,其核心 API 應(yīng)與 0.11.x 版本保持一致,但建議你查閱其官方發(fā)布說明以確認(rèn)是否有進(jìn)一步的變更。

使用新 API 的 JWT 工具類

以下是一個(gè)基于你要求的、使用了最新 parserBuilder() API 的 JWT 工具類示例。

public class SecurityProperties {   
     private JwtConfig jwt = new JwtConfig();     
          /**
         * JWT密鑰 - 至少32字節(jié)(256位)用于HMAC-SHA算法
         */
        private String secret;
        /**
         * JWT過期時(shí)間(秒)
         */
        private Long expiration = 86400L;
        /**
         * JWT刷新過期時(shí)間(秒)
         */
        private Long refreshExpiration = 604800L;
        /**
         * JWT簽發(fā)者
         */
        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對(duì)象
       String refreshTokenIssuer = securityProperties.getJwt().getIssuer() + "-refresh";
        // 替換方法
         JwtBuilder builder = Jwts.builder().claims(claims)
                .subject(subject)
                .issuedAt(toDate(now))
                .expiration(toDate(expirationTime))
                .issuer(refreshTokenIssuer) // 設(shè)置刷新令牌簽發(fā)者
                .audience().add(securityProperties.getJwt().getAudience()).and() // 使用配置的受眾
                .signWith(getSecretKey(), Jwts.SIG.HS512); // 使用HS512算法簽名
        if (claims != null) {
            builder.setClaims(claims);
        }
        // 壓縮生成最終令牌
        return builder.compact();
    }
    /**
     * 解析并驗(yàn)證JWT令牌(使用新API Jwts.parserBuilder())
     *
     * @param token 待解析的JWT字符串
     * @return 解析出的聲明(Claims)
     * @throws JwtException 如果令牌無效、過期或簽名驗(yàn)證失敗
     */
    public Claims parseToken(String token) throws JwtException {
       // 過時(shí)方法
       // return Jwts.parserBuilder() // 使用新的parserBuilder
       //         .setSigningKey(secretKey) // 設(shè)置簽名密鑰
       //         .build() // 構(gòu)建不可變的、線程安全的JwtParser實(shí)例
       //         .parseClaimsJws(token) // 解析并驗(yàn)證JWT
       //         .getBody(); // 獲取載荷(Claims)
       // 替換方法
        return Jwts.parser()
                .verifyWith(getSecretKey())
                .build()
                .parseSignedClaims(token)
                .getPayload();
    }
}

密鑰生成與管理

在上述工具類中,我們使用了 javax.crypto.SecretKey 對(duì)象。你可以使用 JJWT 提供的便捷工具類來生成安全的密鑰:

import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;
import java.util.Base64;
public class KeyGenerator {
    public static void main(String[] args) {
        // 為HS256算法生成一個(gè)安全的密鑰 SignatureAlgorithm.HS256 過時(shí)替換 Jwts.SIG.HS512
        SecretKey key = Keys.secretKeyFor(Jwts.SIG.HS512);
        // 如果需要將密鑰以字符串形式保存(如存儲(chǔ)在配置文件中),可以編碼為Base64
        String base64Key = Base64.getEncoder().encodeToString(key.getEncoded());
        System.out.println("Base64 encoded key: " + base64Key);
        // 在應(yīng)用啟動(dòng)時(shí),可以從Base64字符串重新構(gòu)造SecretKey
        // byte[] decodedKey = Base64.getDecoder().decode(base64Key);
        // SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "HmacSHA256");
    }
}

安全提醒:生產(chǎn)環(huán)境中,密鑰必須妥善保管,嚴(yán)禁硬編碼在代碼中。建議從安全的配置源(如環(huán)境變量、密鑰管理服務(wù))獲取。

如何使用工具類

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

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. 生成密鑰(在實(shí)際應(yīng)用中,這個(gè)密鑰應(yīng)該來自安全配置)
        SecretKey secretKey = Keys.secretKeyFor(Jwts.SIG.HS512);
        long expirationMs = 24 * 60 * 60 * 1000; // 24小時(shí)
        // 2. 初始化JWT工具類
        JwtUtil jwtUtil = new JwtUtil(secretKey, expirationMs);
        // 3. 準(zhǔn)備自定義聲明
        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. 解析和驗(yàn)證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());
        }
    }
}

核心變更與總結(jié)

  • 主要變更:新的 JwtParser 實(shí)例是不可變且線程安全的。
  • 密鑰安全:推薦使用 io.jsonwebtoken.security.Keys 工具類生成安全的 SecretKey 對(duì)象,而不是直接使用字符串。
  • 依賴模塊化:確保你的依賴配置正確,引入了 jjwt-api、jjwt-impljjwt-jackson(或 jjwt-gson)。

希望這個(gè)基于最新 API 的示例能幫助你順利完成升級(jí)!如果你在密鑰管理或者異常處理方面有更多疑問,我很樂意提供進(jìn)一步的信息。

到此這篇關(guān)于Java 21使用JWT 0.13.0最新正確用法的文章就介紹到這了,更多相關(guān)Java21使用JWT0.13.0內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 帶大家認(rèn)識(shí)Java語(yǔ)法之泛型與通配符

    帶大家認(rèn)識(shí)Java語(yǔ)法之泛型與通配符

    使用泛型的目的是利用Java編譯機(jī)制,在編譯過程中幫我們檢測(cè)代碼中不規(guī)范的有可能導(dǎo)致程序錯(cuò)誤的代碼,下面這篇文章主要給大家介紹了關(guān)于Java泛型與通配符的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • java 結(jié)合jQuery實(shí)現(xiàn)跨域名獲取數(shù)據(jù)的方法

    java 結(jié)合jQuery實(shí)現(xiàn)跨域名獲取數(shù)據(jù)的方法

    下面小編就為大家?guī)硪黄猨ava 結(jié)合jQuery實(shí)現(xiàn)跨域名獲取數(shù)據(jù)的方法。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • 詳解Java如何利用位操作符創(chuàng)建位掩碼

    詳解Java如何利用位操作符創(chuàng)建位掩碼

    在本文中,我們來看看如何使用位操作符實(shí)現(xiàn)低級(jí)別的位掩碼。我們將看到我們?nèi)绾螌⒁粋€(gè)單一的int變量作為一個(gè)單獨(dú)的數(shù)據(jù)容器,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-10-10
  • 解讀Map中的computeIfAbsent方法

    解讀Map中的computeIfAbsent方法

    文章介紹了Java 8中Map接口的computeIfAbsent方法,該方法用于在Map中獲取指定鍵的值,如果不存在則調(diào)用提供的函數(shù)計(jì)算值并放入Map中,并給出了使用示例
    2026-05-05
  • RecyclerChart動(dòng)態(tài)屬性圖標(biāo)聯(lián)動(dòng)數(shù)據(jù)動(dòng)態(tài)加載詳解

    RecyclerChart動(dòng)態(tài)屬性圖標(biāo)聯(lián)動(dòng)數(shù)據(jù)動(dòng)態(tài)加載詳解

    這篇文章主要為大家介紹了RecyclerChart動(dòng)態(tài)屬性圖標(biāo)聯(lián)動(dòng)數(shù)據(jù)動(dòng)態(tài)加載詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • MyBatis Excutor 攔截器的巧妙用法

    MyBatis Excutor 攔截器的巧妙用法

    這里要講的巧妙用法是用來實(shí)現(xiàn)在攔截器中執(zhí)行額外 MyBatis 現(xiàn)有方法的用法,并提供了解決攔截Executor時(shí)想要修改MappedStatement時(shí)解決并發(fā)的問題。感興趣的朋友一起看看吧
    2017-10-10
  • Java GC垃圾回收算法分析

    Java GC垃圾回收算法分析

    垃圾回收機(jī)制簡(jiǎn)稱GC,主要用于Java堆的管理。在JVM中程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧生命周期隨跟隨線程,棧幀的進(jìn)棧和入棧能實(shí)現(xiàn)自動(dòng)清理。而 jdk8后元空間為本地內(nèi)存也不受GC控制,所以垃圾回收主要是在堆中
    2022-12-12
  • 詳解用maven搭建springboot環(huán)境的方法

    詳解用maven搭建springboot環(huán)境的方法

    本篇文章主要介紹了詳解用maven搭建springboot環(huán)境的方法,這里整理了詳細(xì)的代碼,非常具有實(shí)用價(jià)值,有需要的小伙伴可以參考下
    2017-08-08
  • Java中StringBuilder與StringBuffer使用及源碼解讀

    Java中StringBuilder與StringBuffer使用及源碼解讀

    我們前面學(xué)習(xí)的String就屬于不可變字符串,因?yàn)槔碚撋弦粋€(gè)String字符串一旦定義好,其內(nèi)容就不可再被改變,但實(shí)際上,還有另一種可變字符串,包括StringBuilder和StringBuffer兩個(gè)類,那可變字符串有什么特點(diǎn),又怎么使用呢,接下來就請(qǐng)大家跟我一起來學(xué)習(xí)吧
    2023-05-05
  • 一文掌握J(rèn)VM?Safe?Point

    一文掌握J(rèn)VM?Safe?Point

    關(guān)于?Safe?Point?是?JVM?中很關(guān)鍵的一個(gè)概念,但我估計(jì)有不少同學(xué)不是很懂,于是今天跟大家來深入聊聊?Safe?Point,通過本文學(xué)習(xí)你會(huì)了解什么是?Safe?Point?為啥需要?Safe?Point?Safe?Point?與?Stop?the?World?的關(guān)系?感興趣的朋友一起看看吧
    2022-10-10

最新評(píng)論

贵德县| 高淳县| 玛沁县| 永兴县| 建平县| 兴宁市| 慈溪市| 永宁县| 青冈县| 梁平县| 穆棱市| 寿阳县| 忻城县| 招远市| 灵寿县| 石城县| 白河县| 普宁市| 瑞金市| 枝江市| 奎屯市| 钦州市| 当涂县| 蓝田县| 绍兴市| 金溪县| 阳谷县| 昆明市| 沈阳市| 河东区| 长海县| 金平| 阜平县| 铅山县| 彝良县| 石景山区| 泾阳县| 平潭县| 托克托县| 鲁山县| 绥化市|