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
相关产品推荐
相关产品推荐

