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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 10:24:03