You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:35:28