概念层面的区别

过滤器(Filter)

  • 基于Servlet规范,是Java Web标准的一部分

  • 在请求到达Servlet之前和响应返回客户端之前进行处理

  • 属于容器级别的组件

拦截器(Interceptor)

  • 基于框架实现,如Spring MVC的拦截器

  • 在Controller方法执行前后进行处理

  • 属于框架级别的组件

执行时机和顺序

请求流程:
客户端 → Filter → Servlet → Interceptor → Controller → Interceptor → Servlet → Filter → 客户端

具体执行顺序:

  1. Filter的doFilter()方法(请求前处理)

  2. Servlet处理

  3. Interceptor的preHandle()方法

  4. Controller方法执行

  5. Interceptor的postHandle()方法

  6. Interceptor的afterCompletion()方法

  7. Filter的doFilter()方法(响应后处理)

使用场景对比

过滤器适用场景:

  • 字符编码设置

  • 跨域处理

  • 安全检查(如XSS防护)

  • 日志记录

  • 压缩处理

拦截器适用场景:

  • 用户登录验证

  • 权限检查

  • 操作日志记录

  • 性能监控

  • 参数预处理

代码实现示例

过滤器实现:

@WebFilter("/*")
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
                        FilterChain chain) throws IOException, ServletException {
        // 请求前处理
        System.out.println("Filter: 请求前处理");
        
        chain.doFilter(request, response); // 继续执行
        
        // 响应后处理
        System.out.println("Filter: 响应后处理");
    }
}

拦截器实现:

@Component
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, 
                           HttpServletResponse response, 
                           Object handler) throws Exception {
        System.out.println("Interceptor: 控制器执行前");
        return true; // 返回true继续执行
    }
    
    @Override
    public void postHandle(HttpServletRequest request, 
                          HttpServletResponse response, 
                          Object handler, 
                          ModelAndView modelAndView) throws Exception {
        System.out.println("Interceptor: 控制器执行后");
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, 
                               HttpServletResponse response, 
                               Object handler, 
                               Exception ex) throws Exception {
        System.out.println("Interceptor: 请求完成后");
    }
}

主要区别总结

特性

过滤器

拦截器

依赖

Servlet容器

Spring框架

粒度

粗粒度,基于URL

细粒度,可精确到方法

执行时机

Servlet前后

Controller前后

异常处理

无法捕获Controller异常

可以处理Controller异常

功能丰富程度

相对简单

功能更丰富,可访问IOC容器

简单记忆:过滤器更"外层",拦截器更"内层";过滤器是容器级的,拦截器是框架级的。根据你的具体需求选择合适的方案。