过滤器和拦截器在Web开发中扮演不同角色,主要区别如下:
目录
1. 作用层次不同
- 过滤器(Filter):属于Servlet规范,工作在Servlet容器层面,处理所有进入容器的HTTP请求(如静态资源、动态请求)。
- 拦截器(Interceptor):属于框架层(如Spring MVC),仅拦截处理控制器(Controller)的请求,不处理静态资源。
2. 执行顺序
- 请求流程:
客户端请求 → 过滤器(前处理) → DispatcherServlet → 拦截器(preHandle) → 控制器方法 → 拦截器(postHandle) → 视图渲染 → 拦截器(afterCompletion) → 过滤器(后处理) → 响应返回。 - 过滤器在拦截器前后执行,拦截器仅在控制器方法前后介入。
3. 功能范围
- 过滤器:
- 通用预处理(如设置字符编码、日志记录)。
- 修改请求/响应内容(如压缩、加密)。
- 无法访问Spring上下文或方法参数。
- 拦截器:
- 业务逻辑处理(如权限校验、日志记录操作细节)。
- 可获取方法参数、返回值,访问Spring Bean。
- 支持更细粒度控制(通过注解或路径匹配)。
4. 生命周期与配置
- 过滤器:
- 由Servlet容器管理,生命周期独立于Spring。
- 配置方式:
web.xml
或@WebFilter
注解。
- 拦截器:
- 由Spring容器管理,生命周期与Bean一致。
- 配置方式:实现
HandlerInterceptor
接口或使用@Component
+路径匹配。
5. 核心接口与方法
- 过滤器:
- 接口:
javax.servlet.Filter
- 方法:
doFilter(ServletRequest, ServletResponse, FilterChain)
- 通过
FilterChain
控制请求放行或终止。
- 接口:
- 拦截器:
- 接口:
org.springframework.web.servlet.HandlerInterceptor
- 方法:
preHandle()
:控制器方法前执行。postHandle()
:方法后、视图渲染前执行。afterCompletion()
:视图渲染后执行(常用于资源清理)。
- 接口:
6. 典型场景
- 过滤器适用场景:
- 全局字符编码设置。
- 跨域请求(CORS)处理。
- 请求日志统一记录。
- 拦截器适用场景:
- 用户登录状态校验。
- 操作日志记录(含方法参数)。
- 事务管理(如
@Transactional
的AOP实现)。
总结
特性 | 过滤器(Filter) | 拦截器(Interceptor) |
---|---|---|
作用范围 | 所有HTTP请求(含静态资源) | 仅控制器请求 |
访问权限 | 无法访问Spring上下文 | 可访问Spring Bean及方法参数 |
配置方式 | web.xml 或@WebFilter | Spring配置或@Component +路径匹配 |
生命周期 | Servlet容器管理 | Spring容器管理 |
典型用途 | 全局预处理(编码、日志) | 业务逻辑控制(权限、日志、事务) |
选择依据:
- 需要全局处理或修改请求/响应内容时用过滤器。
- 需要细粒度业务控制或访问Spring上下文时用拦截器。