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

Java出現(xiàn):JWT strings must contain exactly 2 period characters. Found: 0的常見原因及解決方案

 更新時間:2026年01月09日 10:08:31   作者:hellotutu  
這篇文章主要介紹了JWT令牌解析失敗的原因和解決方法,包括Header、Payload和Signature三段式結構,常見錯誤原因,通用解決方案以及額外注意點,需要的朋友可以參考下

這個錯誤的核心是:你傳入的JWT令牌字符串沒有包含必需的2個英文句點(.),導致JWT解析器無法按標準拆分令牌結構。

一、先理解JWT的標準結構

合法的JWT令牌必須是 Header.Payload.Signature 三段式結構(包含2個句點),例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
  • 第一段:Header(Base64編碼)
  • 第二段:Payload(Base64編碼)
  • 第三段:Signature(簽名)
  • 段與段之間用英文句點 . 分隔

二、錯誤的常見原因(按優(yōu)先級排查)

1. 傳入的令牌為空/空白字符串

  • 現(xiàn)象:前端未傳遞token、后端接收時為空,或token被誤置為空字符串("")。
  • 排查:
// 解析前先校驗token是否為空
String token = request.getHeader("Authorization");
if (token == null || token.trim().isEmpty()) {
    throw new IllegalArgumentException("JWT令牌不能為空");
}
// 若用Bearer Token,需先截取(例如:Bearer <token>)
if (token.startsWith("Bearer ")) {
    token = token.substring(7).trim(); // 去掉"Bearer "前綴
}

2. 令牌被截斷/拼接錯誤

  • 現(xiàn)象:token傳遞過程中被截斷(如URL編碼/解碼錯誤、字符長度限制),或拼接時丟失句點。
  • 排查:
    • 打印原始token值,確認是否完整(例如:System.out.println("原始token:" + token));
    • 檢查前端傳遞時是否對token做了不必要的轉義(如把 . 轉成 %2E 但后端未解碼)。

3. 令牌格式錯誤(非JWT)

  • 現(xiàn)象:傳入的不是JWT令牌,而是普通字符串、SessionID、其他格式的token(如只有一段/一段半)。
  • 排查:
    • 確認生成token的代碼是否正確(例如:使用JJWT/Java JWT庫生成時,是否完整調用了簽名步驟);
    • 示例:正確生成JWT(以JJWT為例):
// 正確生成三段式JWT
String jwt = Jwts.builder()
    .setHeaderParam("alg", "HS256")
    .setSubject("user123")
    .signWith(SignatureAlgorithm.HS256, "secretKey")
    .compact(); // compact()會生成標準的Header.Payload.Signature結構

4. 令牌被篡改/手動修改

  • 現(xiàn)象:token被人為刪除句點,或傳輸中被篡改(如空格替換句點)。
  • 排查:校驗token的字符組成,確保僅包含Base64URL合法字符(字母、數(shù)字、-_、.)。

三、通用解決方案(解析前增加校驗)

在解析JWT前,先校驗token的格式合法性,避免直接拋出異常:

import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;

public String parseJwt(String token) {
    // 第一步:校驗非空+句點數(shù)量
    if (token == null || token.trim().isEmpty()) {
        throw new IllegalArgumentException("JWT令牌不能為空");
    }
    int dotCount = token.length() - token.replace(".", "").length();
    if (dotCount != 2) {
        throw new IllegalArgumentException("JWT令牌格式錯誤,必須包含2個句點(.),當前數(shù)量:" + dotCount);
    }
    
    // 第二步:解析JWT(示例)
    try {
        return Jwts.parser()
            .setSigningKey("secretKey")
            .parseClaimsJws(token)
            .getBody()
            .getSubject();
    } catch (JwtException e) {
        throw new RuntimeException("JWT解析失?。? + e.getMessage());
    }
}

四、額外注意點

  1. Bearer Token前綴:前端傳遞的token常帶 Bearer 前綴(如 Bearer eyJhbGciOiJIUzI1Ni...),需先截取掉前綴再解析;
  2. Base64URL編碼:JWT的段使用Base64URL編碼(區(qū)別于普通Base64),若手動解碼需注意替換字符(+-,/_,去掉末尾=);
  3. 框架自動解析:若使用Spring Security OAuth2等框架,需確認配置的token提取器是否正確(如從Header/參數(shù)中提?。?。

快速定位技巧

在解析代碼前添加日志,打印原始token值:

System.out.println("待解析的JWT令牌:[" + token + "]");

通過日志可直接判斷:

  • 若打印 [] → token為空;
  • 若打印 [eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9] → 只有一段(缺少2個句點);
  • 若打印 [eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkw] → 只有1個句點(缺少1個)。

到此這篇關于Java出現(xiàn):JWT strings must contain exactly 2 period characters. Found: 0的常見原因及解決方案的文章就介紹到這了,更多相關Java出現(xiàn):characters. Found: 0內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • spring整合kaptcha驗證碼的實現(xiàn)

    spring整合kaptcha驗證碼的實現(xiàn)

    這篇文章主要介紹了spring整合kaptcha驗證碼的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • ActiveMQ結合Spring收發(fā)消息的示例代碼

    ActiveMQ結合Spring收發(fā)消息的示例代碼

    這篇文章主要介紹了ActiveMQ結合Spring收發(fā)消息的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • JVM自定義類加載器在代碼擴展性實踐分享

    JVM自定義類加載器在代碼擴展性實踐分享

    這篇文章主要介紹了JVM自定義類加載器在代碼擴展性實踐分享,一個類型從被加載到虛擬機內存中開始,到卸載出內存為止,它的整個生命周期將會經(jīng)歷加載、驗證、準備、解析、初始化 、使用和卸載七個階段,其中驗證、準備、解析三個部分統(tǒng)稱為連接
    2022-06-06
  • springboot實現(xiàn)圖片大小壓縮功能

    springboot實現(xiàn)圖片大小壓縮功能

    這篇文章主要為大家詳細介紹了springboot實現(xiàn)圖片大小壓縮功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 帶你快速搞定java多線程(2)

    帶你快速搞定java多線程(2)

    這篇文章主要介紹了java多線程編程實例,分享了幾則多線程的實例代碼,具有一定參考價值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下
    2021-07-07
  • Java實現(xiàn)滑動驗證碼的示例代碼

    Java實現(xiàn)滑動驗證碼的示例代碼

    這篇文章主要為大家介紹了如何用Java語言實現(xiàn)滑動驗證碼的生成,項目采用了springboot,maven等技術,感興趣的小伙伴可以跟隨小編學習一下
    2022-02-02
  • Java設計模式之裝飾模式詳解

    Java設計模式之裝飾模式詳解

    這篇文章主要介紹了Java設計模式中的裝飾者模式,裝飾者模式即Decorator Pattern,裝飾模式是在不必改變原類文件和使用繼承的情況下,動態(tài)地擴展一個對象的功能,裝飾模式又名包裝模式。裝飾器模式以對客戶端透明的方式拓展對象的功能,是繼承關系的一種替代方案
    2022-08-08
  • Java多線程編程:線程的原理和使用安全

    Java多線程編程:線程的原理和使用安全

    文章主要介紹了線程的基本概念、線程和進程的區(qū)別、線程的創(chuàng)建方法、線程的常見方法與屬性、線程的安全問題等,線程是程序執(zhí)行流的最小單位,可以并發(fā)執(zhí)行并共享數(shù)據(jù),線程的生命周期狀態(tài)包括新建、就緒、運行、阻塞、死亡等
    2026-05-05
  • java自己手動控制kafka的offset操作

    java自己手動控制kafka的offset操作

    這篇文章主要介紹了java自己手動控制kafka的offset操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 5分鐘搞定java單例模式

    5分鐘搞定java單例模式

    單例模式(Singleton?Pattern)是?Java?中最簡單的設計模式之一。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式,本文給大家介紹下java單例模式的相關知識,感興趣的朋友一起看看吧
    2022-03-03

最新評論

墨竹工卡县| 南岸区| 平定县| 宁强县| 钟山县| 林西县| 淅川县| 元谋县| 安西县| 岐山县| 肃南| 微博| 关岭| 察哈| 五家渠市| 武清区| 边坝县| 岚皋县| 卓资县| 邯郸县| 竹北市| 泸水县| 湖南省| 无锡市| 靖州| 平武县| 庄河市| 津南区| 泸定县| 阜阳市| 塘沽区| 繁昌县| 库车县| 桐庐县| 泸水县| 手机| 永丰县| 大化| 晋州市| 高邮市| 江北区|