REST接口无响应排查:受保护路径返回200但无响应体
问题诊断与修复
你的核心问题出在JwtFilter的过滤器链执行逻辑上,同时存在一处逻辑判断错误,导致请求无法正常到达控制器,最终返回200状态码但无响应体。
1. 致命问题:过滤器链未继续执行
在doFilterInternal方法的最后,你成功设置了认证信息到SecurityContextHolder后,没有调用chain.doFilter(request, response)。这会直接终止过滤器链,请求无法传递到后续的过滤器或控制器,自然不会产生任何响应内容。
2. 逻辑判断错误
原代码中关于username的判断条件逻辑颠倒:
if (username == null && SecurityContextHolder.getContext().getAuthentication() != null) { chain.doFilter(request, response); return; }
这行代码仅在username为空且已有认证信息时才放行,正确逻辑应该是:只要username为空,或者已经存在认证信息,就直接放行,避免重复处理。
修改后的JwtFilter代码
@RequiredArgsConstructor public class JwtFilter extends OncePerRequestFilter { private final UserService userService; private final JwtUtils jwtUtils; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { var header = request.getHeader(HttpHeaders.AUTHORIZATION); if (header == null || !header.startsWith(jwtUtils.Bearer)) { chain.doFilter(request, response); return; } var jwt = header.replace(jwtUtils.Bearer, ""); var username = jwtUtils.extractUsername(jwt); // 修正逻辑:username为空 或 已有认证信息时,直接放行 if (username == null || SecurityContextHolder.getContext().getAuthentication() != null) { chain.doFilter(request, response); return; } var user = userService.loadUserByUsername(username); if (!jwtUtils.validateToken(jwt, user) || !user.isEnabled()) { chain.doFilter(request, response); return; } var passwordAuthToken = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities()); passwordAuthToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(passwordAuthToken); // 关键:继续执行过滤器链,让请求到达控制器 chain.doFilter(request, response); } }
额外检查建议
- 确认
jwtUtils.Bearer的值是"Bearer "(注意末尾空格),否则替换JWT时会残留多余字符导致验证失败。 - 测试时可以在控制器方法中添加日志,确认请求是否到达。
内容的提问来源于stack exchange,提问作者user12015704
相关产品推荐
相关产品推荐

