Jwts用于創建和驗證 ??JSON Web Token(JWT)?? 的開源庫詳解

Jwts用于創建和驗證 ??JSON Web Token(JWT)?? 的開源庫詳解

在 Java 開發中,提到 Jwts 通常指的是 ??JJWT(Java JWT)庫??中的核心工具類 io.jsonwebtoken.Jwts。JJWT 是一個專門用于創建和驗證 ??JSON Web Token(JWT)?? 的開源庫,而 Jwts 類是其提供的??入口工具類??,主要用于??構建(簽名)JWT?? 和??解析(驗證并提取內容)JWT??。

??Jwts 的核心作用??

Jwts 類的核心功能圍繞 JWT 的??生命周期??展開,主要包括兩大操作:

  1. ??構建并簽名 JWT??(生成 Token):將業務數據(聲明)打包為 JWT,并通過密鑰或私鑰進行簽名,確保 Token 不可篡改。
  2. ??解析并驗證 JWT??(解析 Token):驗證 JWT 的簽名有效性,并提取其中的聲明(如用戶信息、過期時間等)。

??一、構建并簽名 JWT(生成 Token)??

通過 Jwts.builder() 方法創建一個 JWT 構建器(JwtBuilder),逐步設置 Token 的??聲明(Claims)??和??簽名參數??,最終生成簽名的 JWT 字符串。

??關鍵步驟與方法??
  1. ??設置基礎聲明(必選)??:
    JWT 規范定義了一些標準聲明(Claims),Jwts 提供了便捷方法設置這些聲明:

    • setIssuer(String iss):設置簽發者(Issuer)。
    • setSubject(String sub):設置主題(Subject,通常是用戶標識)。
    • setAudience(String aud):設置接收者(Audience)。
    • setExpiration(Date exp):設置過期時間(必選,Token 失效時間)。
    • setNotBefore(Date nbf):設置生效時間(可選,Token 在此時間前無效)。
    • setIssuedAt(Date iat):設置簽發時間(默認當前時間,可選)。
  2. ??設置自定義聲明(可選)??:
    通過 claim(String name, Object value) 方法添加業務相關的自定義聲明(如用戶角色、權限等)。

  3. ??設置簽名算法和密鑰??:
    通過 signWith(SignatureAlgorithm alg, Key key) 方法指定簽名算法(如 HMAC SHA256、RSA 等)和對應的密鑰(對稱或非對稱)。

??示例:生成 JWT??
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.util.Date;public class JwtGenerator {// 生成安全的密鑰(僅示例,實際需妥善保管)private static final Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);public static String generateToken(String userId, String role) {return Jwts.builder().setSubject(userId) // 主題(用戶ID).claim("role", role) // 自定義聲明:用戶角色.setIssuedAt(new Date()) // 簽發時間(默認當前時間).setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000)) // 過期時間(1小時后).signWith(SECRET_KEY) // 使用 HMAC-SHA256 算法簽名,密鑰為 SECRET_KEY.compact(); // 生成緊湊的 JWT 字符串}public static void main(String[] args) {String token = generateToken("user123", "admin");System.out.println("生成的 JWT: " + token);// 輸出示例:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMTIzIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzE2NTYzMjAwLCJleHAiOjE3MTY1NjY4MDB9.xxx...}
}

??二、解析并驗證 JWT(提取內容)??

通過 Jwts.parserBuilder() 方法創建一個 JWT 解析器(JwtParserBuilder),設置驗證參數(如密鑰、算法),然后調用 parseClaimsJws(String jwt) 方法解析并驗證 JWT。若驗證通過,返回包含聲明的 Claims 對象;若驗證失敗(如簽名錯誤、已過期),則拋出異常。

??關鍵步驟與方法??
  1. ??設置驗證密鑰和算法??:
    通過 setSigningKey(Key key) 方法設置簽名驗證的密鑰(需與生成 Token 時的密鑰一致)。
    若 Token 使用非對稱算法(如 RSA),需設置公鑰(setVerificationKey)。

  2. ??可選配置(如忽略過期時間)??:
    通過 requireExpiration(false) 等方法調整驗證策略(一般不建議忽略過期時間)。

  3. ??解析并驗證??:
    調用 parseClaimsJws(String jwt) 方法解析 Token,返回 Jws<Claims> 對象,通過 getBody() 獲取聲明(Claims)。

??示例:解析 JWT??
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.security.Keys;
import java.security.Key;public class JwtParser {private static final Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256); // 與生成時的密鑰一致public static Claims parseToken(String token) {return Jwts.parserBuilder().setSigningKey(SECRET_KEY) // 設置驗證密鑰.build().parseClaimsJws(token) // 解析并驗證 JWT.getBody(); // 獲取聲明內容}public static void main(String[] args) {String token = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMTIzIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzE2NTYzMjAwLCJleHAiOjE3MTY1NjY4MDB9.xxx..."; // 假設是生成的合法 Tokentry {Claims claims = parseToken(token);System.out.println("用戶ID: " + claims.getSubject()); // 輸出:user123System.out.println("角色: " + claims.get("role")); // 輸出:adminSystem.out.println("過期時間: " + claims.getExpiration()); // 輸出:過期時間戳} catch (Exception e) {System.out.println("Token 解析失敗: " + e.getMessage()); // 簽名錯誤、過期等場景會拋異常}}
}

?

在 Java 的 JWT(JSON Web Token)處理庫 ??JJWT(Java JWT)?? 中,Jwts 是一個核心工具類,主要用于??構建(生成)JWT?? 和??解析(驗證/讀取)JWT??。它本身是一個工廠類,提供靜態方法返回 JwtBuilder(構建器)或 JwtParser(解析器)實例,實際功能由這些實例的方法實現。

三、核心方法分類

Jwts 的方法主要分為兩類:??構建 JWT?? 和 ??解析 JWT??。

1. 構建 JWT(生成令牌)

通過 Jwts.builder() 獲取 JwtBuilder 實例,用于設置 JWT 的聲明(Claims)和簽名,最終生成 JWT 字符串。

常用方法:
方法說明
Jwts.builder()工廠方法,返回一個 JwtBuilder 實例,用于開始構建 JWT。
JwtBuilder.setSubject(String subject)設置 JWT 的主題(sub 聲明),通常為用戶標識。
JwtBuilder.setIssuer(String issuer)設置 JWT 的頒發者(iss 聲明)。
JwtBuilder.setAudience(String audience)設置 JWT 的接收者(aud 聲明)。
JwtBuilder.setExpiration(Date expiration)設置 JWT 的過期時間(exp 聲明,UTC 時間)。
JwtBuilder.setNotBefore(Date notBefore)設置 JWT 的生效時間(nbf 聲明,UTC 時間)。
JwtBuilder.setId(String id)設置 JWT 的唯一標識(jti 聲明),通常用于防重放攻擊。
JwtBuilder.claim(String name, Object value)自定義聲明(如 emailrole 等非標準聲明)。
JwtBuilder.signWith(SignatureAlgorithm algorithm, Key key)指定簽名算法(如 HS256RS256)和密鑰(對稱或非對稱),完成簽名。
2. 解析 JWT(驗證與讀取)

通過 Jwts.parser() 獲取 JwtParser 實例,用于驗證 JWT 的簽名并解析其聲明。

常用方法:
方法說明
Jwts.parser()工廠方法,返回一個 JwtParser 實例,用于開始解析 JWT。
JwtParser.setSigningKey(Key key)設置簽名驗證的密鑰(對稱或非對稱),必須與生成 JWT 時的密鑰一致。
JwtParser.requireIssuer(String issuer)強制驗證 JWT 的頒發者(iss 聲明)必須等于指定值(可選校驗)。
JwtParser.requireAudience(String audience)強制驗證 JWT 的接收者(aud 聲明)必須等于指定值(可選校驗)。
Jws<Claims> parseClaimsJws(String jwt)解析并驗證 JWT(帶 JWS 簽名),返回 Jws<Claims> 對象(包含頭部和聲明)。
Claims parseClaimsJwt(String jwt)解析 JWT(不驗證簽名,僅當已手動驗證過時使用,不安全!)。

四、示例代碼

生成 JWT(構建)
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.util.Date;// 生成密鑰(實際生產環境應安全存儲)
Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);String jws = Jwts.builder().setSubject("user123")                  // 主題.setIssuer("my-app")                    // 頒發者.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000)) // 1小時后過期.claim("role", "admin")                 // 自定義聲明.signWith(key)                          // 簽名(使用 HS256 算法和密鑰).compact();                             // 生成 JWT 字符串
解析 JWT(驗證與讀取)
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import java.security.Key;Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256); // 必須與生成時的密鑰一致String jws = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMTIzIiwib3NfdXNlciI6Im15LWFwcCIsImV4cCI6MTY5MTYxNjAwMCwicm9sZSI6ImFkbWluIn0..."; // 實際 JWT// 解析并驗證簽名
var jwsClaims = Jwts.parser().setSigningKey(key).requireIssuer("my-app") // 強制驗證頒發者.parseClaimsJws(jws);// 讀取聲明
String subject = jwsClaims.getBody().getSubject(); // "user123"
String role = jwsClaims.getBody().get("role", String.class); // "admin"
Date expiration = jwsClaims.getBody().getExpiration(); // 過期時間

五、注意事項

  1. ??版本差異??:JJWT 0.11.x 及以上版本(支持 Java 8+)與舊版本(0.x 早期)API 略有不同(如 Key 類型從 byte[] 改為 java.security.Key),需根據版本調整代碼。
  2. ??簽名驗證??:解析 JWT 時必須調用 signWith()setSigningKey() 驗證簽名,否則無法保證令牌未被篡改。
  3. ??聲明校驗??:推薦通過 requireIssuer()requireAudience() 等方法顯式校驗關鍵聲明,避免使用未驗證的令牌。
  4. ??密鑰安全??:對稱算法(如 HS256)的密鑰需嚴格保密;非對稱算法(如 RS256)需妥善管理公私鑰對。

?Jwts 支持的常見場景??

  • ??單點登錄(SSO)??:用戶登錄后生成 JWT,后續請求攜帶 JWT 完成身份驗證。
  • ??接口鑒權??:微服務間通過 JWT 傳遞用戶權限信息,避免重復查詢數據庫。
  • ??無狀態認證??:服務端無需存儲 Token,通過簽名驗證即可確認 Token 合法性。

??注意事項??

  1. ??密鑰安全??:簽名密鑰(尤其是對稱算法的密鑰)需嚴格保密,泄露會導致 Token 被偽造。
  2. ??算法選擇??:推薦使用安全的算法(如 HS256、RS256),避免使用已廢棄的算法(如 HS384/HS512 需評估性能)。
  3. ??聲明的時效性??:必須設置 exp(過期時間),防止 Token 長期有效被劫持。
  4. ??敏感信息避免明文??:JWT 內容僅 Base64 編碼(可解碼),不要存儲密碼等敏感信息。

??總結??

Jwts 是 JJWT 庫的核心工具類,主要用于??生成和解析 JWT??:

  • ??生成 Token??:通過 Jwts.builder() 設置聲明和簽名,生成簽名的 JWT 字符串。
  • ??解析 Token??:通過 Jwts.parserBuilder() 驗證簽名并提取聲明,確保 Token 合法性和數據完整性。

合理使用 Jwts 可以高效實現無狀態認證、跨服務鑒權等場景,是 Java 中處理 JWT 的首選工具。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92048.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92048.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92048.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如果發送的數據和接受的數據不一致時,怎么辦?

那ART4222這個板卡舉例&#xff0c;我之間輸入一個原始數據“6C532A14”&#xff0c;但是在選擇偶校驗時&#xff0c;接收的是“6C532B14”&#xff0c;我發送的碼率&#xff08;運行速度&#xff09;是100000&#xff0c;但接受的不穩定&#xff0c;比如&#xff1b;“100100.…

ISCC認證:可持續生產的新標桿。ISCC如何更快認證

在全球可持續發展浪潮中&#xff0c;ISCC&#xff08;國際可持續與碳認證&#xff09;體系已成為企業綠色轉型的重要工具。這一國際公認的認證系統覆蓋農業、林業、廢棄物處理等多個領域&#xff0c;通過嚴格的可持續性標準、供應鏈可追溯性要求和碳排放計算規范&#xff0c;建…

想對學習自動化測試的一些建議

Python接口自動化測試零基礎入門到精通&#xff08;2025最新版&#xff09;接觸了不少同行&#xff0c;由于他們之前一直做手工測試&#xff0c;現在很迫切希望做自動化測試&#xff0c;其中不乏工作5年以上的人。 本人從事軟件自動化測試已經近5年&#xff0c;從server端到web…

電子電氣架構 ---智能電動汽車嵌入式軟件開發過程中的block點

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

createAsyncThunk

下面&#xff0c;我們來系統的梳理關于 Redux Toolkit 異步操作&#xff1a;createAsyncThunk 的基本知識點&#xff1a;一、createAsyncThunk 概述 1.1 為什么需要 createAsyncThunk 在 Redux 中處理異步操作&#xff08;如 API 調用&#xff09;時&#xff0c;傳統方法需要手…

STM32F103C8T6 BC20模塊NBIOT GPS北斗模塊采集溫濕度和經緯度發送到EMQX

云平臺配置 訪問下載頁面&#xff1a;免費試用 EMQX Cloud 或 EMQX Enterprise | 下載 EMQX&#xff0c;根據需求選擇對應版本下載。將下載的壓縮包上傳至服務器&#xff08;推薦存放于C盤根目錄&#xff0c;便于后續操作&#xff09;&#xff0c;并解壓至指定路徑&#xff08…

YOLO11漲點優化:自研檢測頭, 新創新點(SC_C_11Detect)檢測頭結構創新,實現有效漲點

目標檢測領域迎來重大突破!本文揭秘原創SC_C_11Detect檢測頭,通過空間-通道協同優化與11層深度結構,在YOLO系列上實現mAP最高提升5.7%,小目標檢測精度暴漲9.3%!創新性結構設計+即插即用特性,為工業檢測、自動駕駛等場景帶來革命性提升! 一、傳統檢測頭的三大痛點 在目…

OSCP 考試期間最新考試政策

根據 Offensive Security 官方最新考試政策&#xff08;2025 年 7 月&#xff09;&#xff0c;OSCP 考試期間禁止或嚴格限制以下工具與行為&#xff1a; 一、絕對禁止使用的工具/服務 類別舉例說明商業/付費版本Metasploit Pro、Burp Suite Pro、Cobalt Strike、Canvas、Core …

如何基于MQ實現分布式事務

文章目錄1.可靠消息最終一致性1.1 本地消息表1.1.1 本地消息表的優缺點1.消息堆積&#xff0c;掃表慢2.集中式掃表&#xff0c;會影響正常業務3.定時掃表的延遲問題1.1.2 本地消息表的代碼實踐1.表結構設計2.具體業務實現1.2 事務消息1.2.1 事務消息的三個階段階段1&#xff1a…

ARM學習(45)AXI協議總線學習

筆者來介紹一下ARM AMBA 總線中的AXI協議 1、簡介 ARM 公司推出的AMBA 總線(Advanced Microcontroller Bus Architecture) ,目前已經推出到AMBA5版本。主要包括 APB:Advanced Peripheral Bus,針對外設 AHB:Advanced High-Performance Bus,高性能總線,支持64/128 位多管…

Visual C++與HGE游戲引擎:創建偽2.5D斜45度視角游戲

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;本教程專注講解如何結合Visual C和HGE游戲引擎構建一個斜45度視角的偽2.5D游戲世界。HGE提供了DirectX的接口&#xff0c;簡化了圖形和音頻處理&#xff0c;使得開發者可以專注于游戲邏輯和視覺效果的實現。教程…

打造個人數字圖書館:LeaNote+cpolar如何成為你的私有化知識中樞?

文章目錄前言1. 安裝Docker2. Docker本地部署Leanote螞蟻筆記3. 安裝cpolar內網穿透4. 固定Leanote螞蟻筆記公網地址前言 在信息爆炸的時代&#xff0c;如何系統管理知識資產并實現價值輸出&#xff1f;螞蟻筆記&#xff08;Leanote&#xff09;提供了一種全新解決方案。這款開…

[特殊字符]? 整個鍵盤控制無人機系統框架

&#x1f3af; 五大核心模塊詳解1. &#x1f4e5; 輸入處理模塊keyboard_control_node ├── 功能&#xff1a;捕獲鍵盤輸入并轉換為ROS消息 ├── 文件&#xff1a;keyboard_control.cpp ├── 輸入&#xff1a;鍵盤按鍵 (W/A/S/D/R/F/Q/E/L/ESC) ├── 輸出&#xff1a;g…

機器學習第三課之邏輯回歸(三)LogisticRegression

目錄 簡介 1.下采樣 2.過采樣 簡介 接上兩篇篇博客最后&#xff0c;我們使用了K折交叉驗證去尋找最合適的C值&#xff0c;提升模型召回率&#xff0c;對于選取C的最優值&#xff0c;我們就要把不同C值放到模型里面訓練&#xff0c;然后用驗證集去驗證得到結果進行比較&#x…

1.Java語言有什么特點

1.Java語言有什么特點 1.面向對象編程&#xff0c;擁有封裝&#xff0c;繼承和多態的特性&#xff0c;所有可以很好的設計出低耦合的項目工程。 2.很好的可移植性&#xff0c;在Java中有java虛擬機&#xff08;JVM&#xff09;的支持&#xff0c;每寫一個類都是.Class文件。J…

部署 Kibana 8.2.2 可視化管理 Elasticsearch 8.2.2 集群

? 適用版本&#xff1a;Elasticsearch 8.2.2 Kibana 8.2.2 一、環境準備 組件版本示例地址Elasticsearch8.2.2192.168.130.61:9200, 192.168.130.62:9200, 192.168.130.65:9200Kibana8.2.2部署在 192.168.130.651操作系統CentOS 7?? 嚴格版本匹配&#xff1a;Kibana 8.2.2…

7.2 I/O接口 (答案見原書 P305)

第7章 輸入/輸出系統 7.1 I/O系統基本概念 (答案見原書 P301) & 7.2 I/O接口 (答案見原書 P305) 01. 在統一編址的方式下,區分存儲單元和I/O設備是靠( A )。 題目原文 在統一編址的方式下,區分存儲單元和I/O設備是靠( )。 A. 不同的地址碼 B. 不同的地址線 C. 不同…

并發編程常用工具類(上):CountDownLatch 與 Semaphore 的協作應用

在 Java 并發編程領域&#xff0c;JDK 提供的工具類是簡化多線程協作的重要武器。這些工具類基于 AQS&#xff08;AbstractQueuedSynchronizer&#xff09;框架實現&#xff0c;封裝了復雜的同步邏輯&#xff0c;讓開發者無需深入底層即可實現高效的線程協作。本文作為并發工具…

Go 工程化全景:從目錄結構到生命周期的完整服務框架

今天天氣很好, 正好手頭有個小項目, 整理了一下中小項目標準化的痛點問題, 如下, 希望可以幫到大家. 一個成熟的 Go 項目不僅需要清晰的代碼組織&#xff0c;還需要完善的生命周期管理。本文將詳細講解生產級 Go 服務的目錄設計&#xff08;包含 model 等核心目錄&#xff09;、…

【C++】2. 類和對象(上)

文章目錄一、類的定義1、類定義格式2、訪問限定符3、類域二、實例化1、實例化概念2、對象??三、this指針四、C和C語?實現Stack對?一、類的定義 1、類定義格式 class為定義類的關鍵字&#xff0c;Stack為類的名字&#xff0c;{ }中為類的主體&#xff0c;注意類定義結束時…