Spring Boot中已认证请求无法触发HandlerInterceptor如何解决
Spring Boot HandlerInterceptor携带有效token不触发的解决方案
该问题的核心原因是带有效token的请求在到达Spring MVC拦截器链路前就被提前截断返回,可按照以下步骤逐一排查修复:
- 检查认证Filter的执行逻辑
绝大多数该场景的问题都是JWT等认证逻辑写在Spring Security的自定义Filter中,认证成功后没有向下传递请求,直接返回了响应。必须确保认证通过后调用filterChain.doFilter(request, response),才能让请求进入Spring MVC的DispatcherServlet链路触发拦截器,参考代码:@Component public class JwtAuthenticationFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String authHeader = request.getHeader("Authorization"); // 跳过无token的请求,交给后续认证逻辑处理 if (authHeader == null || !authHeader.startsWith("Bearer ")) { filterChain.doFilter(request, response); return; } String token = authHeader.substring(7); // 校验token有效性逻辑 if (validateToken(token)) { // 构造认证信息存入Security上下文 UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(getUserId(token), null, getAuthorities(token)); SecurityContextHolder.getContext().setAuthentication(authToken); // 必须执行这行,将请求向下传递到后续Filter、DispatcherServlet和拦截器 filterChain.doFilter(request, response); return; } // 认证失败的返回逻辑 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.getWriter().write("Invalid auth token"); } } - 校验拦截器的注册配置
确认拦截器注册时的路径规则覆盖所有需要生效的请求,且没有误排除认证通过后访问的接口路径,同时不要在配置类上添加@EnableWebMvc注解(该注解会覆盖Spring Boot默认MVC配置,导致自定义拦截器注册失效),注册参考代码:@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Resource private CustomHandlerInterceptor customHandlerInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(customHandlerInterceptor) // 匹配所有请求路径 .addPathPatterns("/**") // 仅排除确实不需要拦截的路径 .excludePathPatterns("/login", "/captcha", "/error"); } } - 检查Spring Security的过滤链配置
如果你使用的是Spring Security 5.7+的Lambda配置风格,确认没有配置会提前截断认证后请求的规则,确保anyRequest().authenticated()规则是最后配置的匹配规则,不会把认证通过的请求提前拦截返回。
内容的提问来源于stack exchange,提问作者lcl
相关产品推荐
相关产品推荐

