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

Spring Boot认证异常求助:/random路径无需认证却返回空响应

问题分析与解决方案

核心原因

问题大概率出在JwtAuthenticationFilter的逻辑处理上:当请求不带Bearer Token时,过滤器没有执行filterChain.doFilter(request, response)来继续传递请求到后续链路(包括Controller),而是直接返回了200状态码但未写入响应体,导致请求被提前截断。

排查与修复步骤

1. 检查JwtAuthenticationFilter的doFilter方法

打开你的JwtAuthenticationFilter类,查看doFilter方法的逻辑。如果存在类似以下错误代码:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    String token = extractToken((HttpServletRequest) request);
    if (token != null && validateToken(token)) {
        // 认证逻辑:设置SecurityContext等
        Authentication auth = createAuthentication(token);
        SecurityContextHolder.getContext().setAuthentication(auth);
        chain.doFilter(request, response);
    } else {
        // 错误:直接返回,不继续执行后续链路
        ((HttpServletResponse) response).setStatus(HttpStatus.OK.value());
        return;
    }
}

2. 修改过滤器逻辑,确保请求能传递到Controller

修改doFilter方法,不管是否存在Token,都要调用chain.doFilter(request, response)让请求继续向下执行,Security的权限配置会自行处理/random路径的放行:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    String token = extractToken(httpRequest);

    if (token != null && validateToken(token)) {
        Authentication auth = createAuthentication(token);
        SecurityContextHolder.getContext().setAuthentication(auth);
    }
    // 关键:必须执行这行,让请求进入后续过滤器和Controller
    chain.doFilter(request, response);
}

3. 可选:针对permitAll路径直接放行(更精准)

如果想让JwtAuthenticationFilter完全跳过/random路径的处理,可以在过滤器开头添加路径判断:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    // 跳过无需认证的路径
    if ("/random".equals(httpRequest.getRequestURI())) {
        chain.doFilter(request, response);
        return;
    }

    String token = extractToken(httpRequest);
    if (token != null && validateToken(token)) {
        Authentication auth = createAuthentication(token);
        SecurityContextHolder.getContext().setAuthentication(auth);
    }
    chain.doFilter(request, response);
}

4. 验证Security配置的路径匹配

确认antMatchers("/random").permitAll()的路径是否正确:

  • 如果你的应用有上下文路径(比如/app),需要写成antMatchers("/app/random").permitAll()
  • 检查是否有其他配置(如antMatchers顺序)覆盖了该规则(antMatchers的匹配顺序是从上到下,优先匹配前面的规则)

验证修复

修改后重新启动应用,不带Bearer Token请求/random路径,应该能正常收到"Random response"响应体。

内容的提问来源于stack exchange,提问作者Cookie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:46:37