在spring mvc中注册自定义拦截器需实现webmvcconfigurer接口并重写addinterceptors方法,编写实现handlerinterceptor的拦截器类,在配置类中通过interceptorregistry注册,支持excludepathpatterns和includepathpatterns路径控制,多拦截器可用@component与@order管理顺序。

在 Spring MVC 中注册自定义拦截器,核心是通过配置类实现 WebMvcConfigurer 接口,并重写 addInterceptors 方法。Spring Boot 2.0+ 默认使用 Java 配置方式,不再推荐修改 WebMvcConfigurationSupport(否则会覆盖默认的静态资源、消息转换器等配置)。
1. 编写自定义拦截器类
实现 HandlerInterceptor 接口,或继承 HandlerInterceptorAdapter(已过时,Spring 5.3+ 不再推荐),建议直接实现接口:
public class LoggingInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("【前置】请求路径:" + request.getRequestURI());
return true; // 返回 false 则中断执行链
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("【完成】响应状态:" + response.getStatus());
}
}
2. 在配置类中注册拦截器
创建一个标注 @Configuration 的类,实现 WebMvcConfigurer,并在 addInterceptors 中添加实例:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoggingInterceptor())
.excludePathPatterns("/public/**", "/error")
.includePathPatterns("/api/**");
}
}
说明:
- excludePathPatterns:跳过指定路径(如静态资源、登录页),避免重复拦截
- includePathPatterns(可选):显式限定生效路径,不设则默认匹配所有
- 若需注入其他 Bean(如
UserService),拦截器应声明为@Component并用@Autowired注入,再通过registry.addInterceptor(context.getBean(LoggingInterceptor.class))注册
3. 使用 @Component + @Order(适用于多拦截器顺序控制)
如果拦截器本身是 Spring 管理的 Bean,可结合 @Order 控制执行顺序:
@Component
@Order(1)
public class AuthInterceptor implements HandlerInterceptor { ... }
@Component
@Order(2)
public class MetricsInterceptor implements HandlerInterceptor { ... }
然后在配置类中注册:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired private AuthInterceptor authInterceptor;
@Autowired private MetricsInterceptor metricsInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor).excludePathPatterns("/login", "/register");
registry.addInterceptor(metricsInterceptor).includePathPatterns("/api/**");
}
}
4. 注意事项
- 拦截器中的
preHandle返回false会阻止后续拦截器和 Controller 执行,但afterCompletion仍会被调用(只要preHandle曾返回true) - 不要在拦截器中直接操作
response.getOutputStream()或response.getWriter()后再放行,可能导致“response already committed”异常 - 全局异常处理器(
@ControllerAdvice)在拦截器之后执行,因此afterCompletion能捕获到异常对象ex - Spring Boot 3.x(基于 Jakarta EE 9+)需确保依赖和包名使用
jakarta.servlet,而非javax.servlet
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











