过滤器和拦截器的区别?

发布于:2025-08-30 ⋅ 阅读:(23) ⋅ 点赞:(0)

过滤器(Filter)和拦截器(Interceptor)都是 Java Web 开发中用于处理请求和响应的组件,但它们在技术归属、作用范围、执行时机等方面有显著区别。以下是具体对比:

1. 技术归属不同

  • 过滤器(Filter)
    属于 Servlet 规范,是 Java EE 标准的一部分,由 Servlet 容器(如 Tomcat)管理。
    依赖于 Servlet 容器,无法脱离 Servlet 环境使用。

  • 拦截器(Interceptor)
    属于 Spring 框架,是 Spring MVC 的一部分,由 Spring 容器管理。
    依赖于 Spring 环境,通常用于 Spring MVC 或 Spring Boot 项目中。

2. 作用范围不同

  • 过滤器
    可拦截所有请求(包括静态资源如 HTML、CSS、JS,以及非 Spring MVC 处理的请求),只要在 web.xml 或注解中配置了拦截路径,就会生效。
    例如:拦截 /api/* 路径下的所有请求,无论是否由 Controller 处理。

  • 拦截器
    仅拦截Spring MVC 处理的请求(即通过 @Controller 或 @RestController 定义的接口),对静态资源或非 Spring 管理的请求无效。
    例如:只能拦截 Controller 中的 @GetMapping@PostMapping 等方法。

3. 执行时机与生命周期不同

  • 过滤器的执行时机
    在 Servlet 容器接收请求后,进入 Spring MVC 之前执行,且在响应返回给客户端前也会执行。
    生命周期由 Servlet 容器控制:init()(初始化)→ doFilter()(处理请求)→ destroy()(销毁)。

    核心方法 doFilter() 接收 ServletRequestServletResponse 和 FilterChain 参数,通过 chain.doFilter() 放行请求。

  • 拦截器的执行时机
    在 Spring MVC 的 DispatcherServlet 接收请求后,调用 Controller 方法前后执行,更贴近业务逻辑层。
    生命周期由 Spring 容器管理,提供 3 个核心方法:

    • preHandle():Controller 方法执行前调用(返回 true 放行,false 拦截)。
    • postHandle():Controller 方法执行后、视图渲染前调用。
    • afterCompletion():视图渲染完成后、响应返回前调用(通常用于资源清理)。

4. 功能权限不同

  • 过滤器
    可修改 ServletRequest、ServletResponse 的内容(如设置编码、修改参数),甚至可以完全替换请求或响应对象。
    但无法直接访问 Spring 容器中的 Bean(如需访问,需通过 WebApplicationContextUtils 间接获取)。

  • 拦截器
    可访问 Spring MVC 的核心对象(如 HandlerMethodModelAndView),能直接获取 Controller 方法的参数、注解等信息。
    可直接注入 Spring 容器中的 Bean(如 Service、Dao),便于调用业务逻辑。

5. 典型应用场景

  • 过滤器适用场景

    • 全局编码处理(如设置 UTF-8 字符集)。
    • 静态资源访问控制(如限制未登录用户访问 JS/CSS)。
    • 请求参数过滤(如防 XSS 攻击、敏感词过滤)。
    • 日志记录(记录所有请求的 URL、IP 等)。
  • 拦截器适用场景

    • 权限验证(如检查用户是否登录、是否有操作权限)。
    • 业务逻辑增强(如 Controller 方法执行前后添加日志、计时)。
    • 事务管理(如 Controller 方法执行异常时回滚事务)。
    • 缓存控制(如对特定接口返回结果进行缓存)。

执行顺序对比(一次请求的完整流程)

  1. 客户端发送请求到 Servlet 容器(Tomcat)。
  2. 过滤器(Filter) 执行 doFilter() 方法(请求进入时)。
  3. 请求进入 Spring MVC 的 DispatcherServlet。
  4. 拦截器(Interceptor) 执行 preHandle() 方法(Controller 执行前)。
  5. Controller 方法执行。
  6. 拦截器执行 postHandle() 方法(Controller 执行后,视图渲染前)。
  7. 视图渲染(如 Thymeleaf、JSP 解析)。
  8. 拦截器执行 afterCompletion() 方法(视图渲染后)。
  9. 过滤器执行 doFilter() 方法中 chain.doFilter() 之后的逻辑(响应返回前)。
  10. 响应返回给客户端。

总结

对比维度 过滤器(Filter) 拦截器(Interceptor)
技术归属 Servlet 规范(Java EE) Spring 框架(Spring MVC)
作用范围 所有请求(含静态资源) 仅 Spring MVC 处理的请求
执行时机 Servlet 容器层面(早于 MVC) Spring MVC 层面(Controller 前后)
依赖环境 依赖 Servlet 容器 依赖 Spring 容器
访问权限 可修改请求 / 响应,难访问 Spring Bean 可访问 Controller 信息,易注入 Spring Bean

实际开发中,过滤器更适合处理底层通用逻辑(如编码、全局过滤),拦截器更适合处理业务相关逻辑(如权限、日志),二者可配合使用。