1. 技术规范来源
- 过滤器:基于Java Servlet规范实现
- 拦截器:基于Spring框架实现
2. 实现原理差异
- 过滤器:通过函数回调机制实现,核心方法
doFilter()
通过回调链传递请求
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 预处理逻辑
chain.doFilter(request, response); // 回调下一个过滤器
// 后处理逻辑
}
- 拦截器:基于动态代理技术实现,通过实现
HandlerInterceptor
接口
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// Controller方法执行前的处理
return true; // 决定是否继续执行
}
3. 作用范围差异
特性 | 过滤器 | 拦截器 |
---|---|---|
请求类型 | 所有HTTP请求 | Controller请求 |
静态资源 | 可以处理 | 默认不处理静态资源,可通过配置支持 |
配置方式 | web.xml | Spring配置 |
4. 执行顺序差异
- 完整请求处理流程:
- 过滤器链预处理
- 拦截器preHandle
- Controller方法执行
- 拦截器postHandle
- 视图渲染(若有)
- 拦截器afterCompletion
- 过滤器链后处理
5. 典型应用场景
-
过滤器适用场景(底层通用处理):
- 请求/响应编码设置
- 敏感字符过滤
- 基础权限验证
- 请求日志记录
-
拦截器适用场景(业务逻辑增强):
- 接口耗时统计
- 登录状态验证
- 数据权限校验
- 业务日志记录
架构建议:在Spring项目中优先使用拦截器处理业务相关逻辑,保留过滤器用于处理与Servlet容器密切相关的底层操作。这种分层设计既保持框架特性,又符合Spring的生态体系。