Spring Boot 拦截器(Interceptor)与过滤器(Filter)深度解析
一、核心概念对比
1. 本质区别
| 维度 | 过滤器(Filter) | 拦截器(Interceptor) |
|---|
| 规范层级 | Servlet 规范(J2EE 标准) | Spring MVC 框架机制 |
| 作用范围 | 所有请求(包括静态资源) | 只处理 Controller 请求 |
| 依赖关系 | 不依赖 Spring 容器 | 完全集成 Spring IOC 容器 |
| 执行顺序 | 最先执行(在 DispatcherServlet 之前) | 在 DispatcherServlet 之后执行 |
| 异常处理 | 无法直接使用 Spring 的异常处理机制 | 可以通过@ControllerAdvice 统一处理 |
2. 执行流程示意图
HTTP Request ↓ Filter Chain(doFilter) ↓ DispatcherServlet ↓ Interceptor.preHandle ↓ Controller Method ↓ Interceptor.postHandle ↓ View Rendering(如有) ↓ Interceptor.afterCompletion ↓ Filter Chain(返回响应)
二、过滤器(Filter)开发指南
1. 基础实现方式
@Component
public class LogFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
long startTime = System.currentTimeMillis();
HttpServletRequest req = (HttpServletRequest) request;
System.out.println( + req.getRequestURI());
chain.doFilter(request, response);
System.currentTimeMillis() - startTime;
System.out.println( + duration + );
}
}