登录后无法生成Bearer Token,JWT格式异常问题求助
问题排查与解决方向
核心问题分析
JWT strings must contain exactly 2 period characters. Found: 0 这个错误说明系统在尝试解析一个空的或完全不符合JWT结构的字符串,而你遇到的登录后无法生成Token+BadCredentialsException异常,大概率是登录请求的处理流程被错误拦截,导致Token生成逻辑未触发,反而触发了JWT验证逻辑。
具体排查步骤
1. 检查过滤器执行顺序(AppConfig)
登录请求应该只走UsernamePasswordAuthenticationFilter(账号密码校验)和JwtTokenGeneratorFilter(Token生成),绝对不能被JwtTokenValidationFilter拦截。
- 查看你的
SecurityFilterChain配置,确认:JwtTokenValidationFilter是否被设置了请求匹配规则,排除登录接口(比如/login),示例:.addFilterBefore(jwtTokenValidationFilter, UsernamePasswordAuthenticationFilter.class) .requestMatchers("/login").permitAll()- 确保
JwtTokenGeneratorFilter是在UsernamePasswordAuthenticationFilter之后执行,只有账号密码校验通过后才触发Token生成:.addFilterAfter(jwtTokenGeneratorFilter, UsernamePasswordAuthenticationFilter.class)
2. 排查JwtTokenGeneratorFilter的Token生成逻辑
确认Token生成代码是否正确生成了符合JWT结构(Header.Payload.Signature)的字符串:
- 检查是否调用了
Jwts.builder()的compact()方法——这是生成完整JWT字符串的关键步骤,漏写会导致生成无效/空内容。示例正确逻辑:String token = Jwts.builder() .setSubject(auth.getName()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 36000000)) .signWith(SignatureAlgorithm.HS512, "your-secret-key") .compact(); // 必须调用此方法生成有效JWT response.addHeader("Authorization", "Bearer " + token); - 确认
SecurityContextHolder中是否拿到了已认证的Authentication对象,只有登录成功后才应该触发Token生成逻辑。
3. 修正JwtTokenValidationFilter的空Token处理逻辑
如果验证过滤器意外拦截了登录请求,必须对空Token的情况直接放行,而不是抛出异常:
String authHeader = request.getHeader("Authorization"); if (authHeader == null || !authHeader.startsWith("Bearer ")) { // 无有效Token,直接放行(登录请求会走账号密码校验流程) filterChain.doFilter(request, response); return; } // 正常解析Token的逻辑
若此处未正确放行,会导致登录请求被验证过滤器拦截,解析空字符串触发Found: 0的错误,同时错误抛出BadCredentialsException。
大概率的根因
- 过滤器顺序配置错误,JWT验证过滤器拦截了登录请求;
- Token生成代码漏写
compact()方法,未生成有效JWT; - 验证过滤器对空Token的处理逻辑错误,直接抛出异常阻断登录流程。
内容的提问来源于stack exchange,提问作者gzhe1056
相关产品推荐
相关产品推荐

