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-impl和jjwt-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ǔ)法之泛型與通配符
使用泛型的目的是利用Java編譯機(jī)制,在編譯過程中幫我們檢測(cè)代碼中不規(guī)范的有可能導(dǎo)致程序錯(cuò)誤的代碼,下面這篇文章主要給大家介紹了關(guān)于Java泛型與通配符的相關(guān)資料,需要的朋友可以參考下2022-03-03
java 結(jié)合jQuery實(shí)現(xiàn)跨域名獲取數(shù)據(jù)的方法
下面小編就為大家?guī)硪黄猨ava 結(jié)合jQuery實(shí)現(xiàn)跨域名獲取數(shù)據(jù)的方法。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-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)加載詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
詳解用maven搭建springboot環(huán)境的方法
本篇文章主要介紹了詳解用maven搭建springboot環(huán)境的方法,這里整理了詳細(xì)的代碼,非常具有實(shí)用價(jià)值,有需要的小伙伴可以參考下2017-08-08
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

