拦截器 vs 过滤器
拦截器(Interceptor)和过滤器(Filter)都是 Java Web 应用中实现 AOP(面向切面编程)思想的重要组件,它们都可以用来在请求处理前后执行特定的逻辑。但在底层机制、归属规范和应用场景上有非常显著的区别。
在以 Spring Boot 为核心的后端架构中,理解这两者的差异是设计优雅请求处理链路的关键。
核心对比
| 维度 | 过滤器 (Filter) | 拦截器 (Interceptor) |
|---|---|---|
| 规范与归属 | Servlet 规范的一部分,由 Servlet 容器(如 Tomcat)管理。 | Spring MVC 框架的一部分,由 Spring 容器管理。 |
| 触发机制 | 基于函数回调(chain.doFilter())。 |
基于 Java 反射机制(动态代理)和 Spring 的 HandlerExecutionChain。 |
| 拦截范围 | 几乎拦截所有进入容器的请求(包括静态资源、JSP 等)。 | 通常只拦截发往 Controller(Handler)的请求。 |
| 上下文感知能力 | 只能获取到 ServletRequest、ServletResponse。感知不到 Spring 的 Bean 和具体的 Controller 方法。 |
可以注入 Spring Bean,并且能通过参数获取到即将执行的 Controller 方法(HandlerMethod)。 |
| 执行时机 | 在请求进入 DispatcherServlet 之前执行。 |
在 DispatcherServlet 之后,到达具体 Controller 之前执行。 |
