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

Spring服务返回200但Postman显示404,求技术排查方案

嘿,我刚上手Spring Security JWT的时候也碰到过这种诡异的问题,服务端日志显示200但Postman报404,大概率是几个细节配置出了问题,咱们一步步来排查:

1. 先确认请求真的到达了控制器

先把服务端日志级别调到DEBUG,重点盯这几个点:

  • 请求路径是不是严格匹配/GET_CURRENT_USER,有没有大小写、拼写错误(比如少写了下划线)
  • 日志里有没有控制器方法的执行记录(比如UserController.getCurrentUser()的打印日志)
    如果只看到请求进来返回200,但没走到控制器逻辑,那基本是过滤器拦截后没放行。

2. 检查JWT过滤器的放行逻辑

自定义JWT过滤器时,很容易漏掉关键的一行代码:filterChain.doFilter(request, response)。如果验证token通过后没调用这个方法,请求就会被过滤器“吃掉”,根本到不了控制器。正确的过滤器逻辑应该是这样的:

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    String authHeader = request.getHeader("Authorization");
    if (authHeader != null && authHeader.startsWith("Bearer ")) {
        String token = authHeader.substring(7);
        if (jwtTokenProvider.validateToken(token)) {
            Authentication auth = jwtTokenProvider.getAuthentication(token);
            SecurityContextHolder.getContext().setAuthentication(auth);
        }
    }
    // 必须调用这行,让请求继续流向控制器
    filterChain.doFilter(request, response);
}

如果之前没加这行,补上之后再测试试试。

3. 核对控制器的路径映射

检查你的GET_CURRENT_USER控制器方法的注解,确保路径完全匹配:

@RestController
public class UserController {
    @GetMapping("/GET_CURRENT_USER") // 这里的路径要和Postman请求的完全一致
    public ResponseEntity<User> getCurrentUser(Authentication authentication) {
        // 加个日志确认是不是走到这里了
        System.out.println("执行getCurrentUser方法");
        User currentUser = userService.getCurrentUser(authentication.getName());
        return ResponseEntity.ok(currentUser);
    }
}

Spring默认路径匹配是严格区分大小写的(除非你特意改了配置),别不小心把路径写成/get-current-user或者GetCurrentUser。

4. 检查Postman的请求细节

  • 确认请求方法是GET,别选错成POST/PUT了
  • 检查Authorization头的格式:必须是Bearer <你的token>,别只放token字符串
  • 如果响应体是空的,Postman有时候会误显示404(虽然状态码是200),这时候看看控制器是不是没返回有效数据,比如返回了null或者序列化出了问题。

5. 排查Spring Security的权限配置

确保/GET_CURRENT_USER路径被配置为需要认证后访问,比如:

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/LOGIN").permitAll() // 登录接口放行
                .requestMatchers("/GET_CURRENT_USER").authenticated() // 需要认证
                .anyRequest().authenticated()
            )
            .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
        return http.build();
    }
}

如果不小心把这个路径设成了permitAll(),虽然不会直接导致404,但可能和你的预期不符。

先从日志和过滤器这两点入手,这是最容易踩坑的地方,应该能解决你的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:38:54