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,需先截?。ɡ纾築earer <token>)
if (token.startsWith("Bearer ")) {
token = token.substring(7).trim(); // 去掉"Bearer "前綴
}
2. 令牌被截斷/拼接錯誤
- 現(xiàn)象:token傳遞過程中被截斷(如URL編碼/解碼錯誤、字符長度限制),或拼接時丟失句點。
- 排查:
- 打印原始token值,確認是否完整(例如:
System.out.println("原始token:" + token)); - 檢查前端傳遞時是否對token做了不必要的轉義(如把
.轉成%2E但后端未解碼)。
- 打印原始token值,確認是否完整(例如:
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());
}
}
四、額外注意點
- Bearer Token前綴:前端傳遞的token常帶
Bearer前綴(如Bearer eyJhbGciOiJIUzI1Ni...),需先截取掉前綴再解析; - Base64URL編碼:JWT的段使用Base64URL編碼(區(qū)別于普通Base64),若手動解碼需注意替換字符(
+→-,/→_,去掉末尾=); - 框架自動解析:若使用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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

