You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,或者返回CallableDeferredResult),需要在注册拦截器时开启异步支持:

registry.addInterceptor(yourInterceptor)
        .addPathPatterns("/**")
        .asyncSupported(true); // 开启异步请求的拦截支持

6. 测试环境的配置问题

如果是在单元测试时发现拦截器没生效,比如用了@WebMvcTest,这个注解默认只会加载控制器类,不会加载拦截器的配置类。你需要在测试类里加上@Import(WebMvcConfig.class),把你的拦截器配置类导入进去。

先从这几点排查,应该能找到问题所在!

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

火山引擎 最新活动