java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java出现:characters. Found: 0

Java出现:JWT strings must contain exactly 2 period characters. Found: 0的常见原因及解决方案

作者:hellotutu

这篇文章主要介绍了JWT令牌解析失败的原因和解决方法,包括Header、Payload和Signature三段式结构,常见错误原因,通用解决方案以及额外注意点,需要的朋友可以参考下

这个错误的核心是:你传入的JWT令牌字符串没有包含必需的2个英文句点(.),导致JWT解析器无法按标准拆分令牌结构

一、先理解JWT的标准结构

合法的JWT令牌必须是 Header.Payload.Signature 三段式结构(包含2个句点),例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

二、错误的常见原因(按优先级排查)

1. 传入的令牌为空/空白字符串

// 解析前先校验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. 令牌被截断/拼接错误

3. 令牌格式错误(非JWT)

// 正确生成三段式JWT
String jwt = Jwts.builder()
    .setHeaderParam("alg", "HS256")
    .setSubject("user123")
    .signWith(SignatureAlgorithm.HS256, "secretKey")
    .compact(); // compact()会生成标准的Header.Payload.Signature结构

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

三、通用解决方案(解析前增加校验)

在解析JWT前,先校验token的格式合法性,避免直接抛出异常:

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

public String parseJwt(String token) {
    // 第一步:校验非空+句点数量
    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个句点(.),当前数量:" + 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编码(区别于普通Base64),若手动解码需注意替换字符(+-/_,去掉末尾=);
  3. 框架自动解析:若使用Spring Security OAuth2等框架,需确认配置的token提取器是否正确(如从Header/参数中提取)。

快速定位技巧

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

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

通过日志可直接判断:

到此这篇关于Java出现:JWT strings must contain exactly 2 period characters. Found: 0的常见原因及解决方案的文章就介绍到这了,更多相关Java出现:characters. Found: 0内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文