Spring Boot拦截器未生效:请求未被拦截问题排查咨询
嗨,我之前也踩过这个坑!拦截器代码写得没问题,但请求过来完全没触发preHandle,大概率是拦截器没被正确接入Spring MVC的拦截链路,或者是路径配置踩了坑。咱们一步步排查常见问题:
1. 拦截器根本没被注册到Spring MVC
这是最常见的原因!你得写一个配置类实现WebMvcConfigurer,手动把拦截器添加到拦截器注册表中,还要指定拦截的路径。比如:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { // 把你的拦截器注入进来(前提是拦截器类被Spring管理) @Autowired private YourInterceptor yourInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(yourInterceptor) // 配置要拦截的路径,比如所有接口用"/**" .addPathPatterns("/**") // 可选:排除不需要拦截的路径,比如登录接口 .excludePathPatterns("/login"); } }
⚠️ 注意:如果用的是Spring Boot 2.x及以上版本,别用WebMvcConfigurationSupport来配置,它会覆盖Spring MVC的默认自动配置,容易导致其他问题,优先用WebMvcConfigurer。
2. 拦截器类没被Spring容器管理
你的拦截器类上有没有加@Component或者@Service注解?如果没有,Spring没法把它注入到配置类里,哪怕你在配置类里手动new一个,虽然能跑,但不利于后续的依赖注入和维护。比如:
@Component // 加上这个注解,让Spring扫描并管理这个Bean public class YourInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 你的逻辑 return true; } }
3. 拦截路径配置不匹配
检查addPathPatterns里的路径是不是和你的接口路径对上了!比如你的接口是/api/user/list,但你配置的拦截路径是/admin/**,那肯定拦截不到。另外,别不小心用excludePathPatterns把目标接口排除了,这个坑很容易踩。
4. 请求没走Spring MVC的处理链
比如你的接口路径是/static/**,Spring Boot默认会把/static下的资源当成静态资源,直接由Servlet容器处理,不会经过Spring MVC的拦截器。这种情况要么调整接口路径,要么修改静态资源的配置路径。
5. 异步请求的特殊情况
如果你的接口是异步的(比如用了@Async,或者返回Callable、DeferredResult),需要在注册拦截器时开启异步支持:
registry.addInterceptor(yourInterceptor) .addPathPatterns("/**") .asyncSupported(true); // 开启异步请求的拦截支持
6. 测试环境的配置问题
如果是在单元测试时发现拦截器没生效,比如用了@WebMvcTest,这个注解默认只会加载控制器类,不会加载拦截器的配置类。你需要在测试类里加上@Import(WebMvcConfig.class),把你的拦截器配置类导入进去。
先从这几点排查,应该能找到问题所在!
内容的提问来源于stack exchange,提问作者sromit




