当前位置: 首页 > web >正文

过滤器和拦截器的区别?

过滤器(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

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

http://www.xdnf.cn/news/19231.html

相关文章:

  • 数据结构(C语言篇):(六)单链表算法题(下)
  • LinuxC语言系统开发——网络编程
  • 英文版在线客服系统支持海外客户的实时聊天解决方案
  • 透视文件IO:从C库函数的‘表象’到系统调用的‘本质’
  • PS的基础操作与图片常用知识
  • 【LeetCode 热题 100】62. 不同路径——(解法二)递推
  • 国务院提出“人工智能+”行动,容智智能体引领产业变革发展
  • Linux下的软件编程——数据库
  • 【备战2025数模国赛】(三)数模常见赛题类型及解决办法
  • 《Unity Shader入门精要》学习笔记三(复杂的光照)
  • 神经网络基础
  • C++中类,this指针,构造函数,析构函数。拷贝构造函数,初步理解运算符重载,初步理解赋值运算符重载
  • 数据结构——线性表(链表,力扣中等篇,增删查改)
  • AWS集成开发最佳实践:构建高效可靠的云管理平台
  • React前端开发_Day4
  • 2025年06月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • SyncBack 备份同步软件: 使用 FTPS、SFTP 和 HTTPS 安全加密传输文件
  • IDEA之GO语言开发
  • 虚拟私有网络笔记
  • 成都五块石写字楼出租,国际数字影像产业园影像企业专属
  • Tinymce富文本编辑器封装
  • 云手机技术中都有着哪些局限性?
  • mysql中cross join于普通join的区别
  • 无懈可击的 TCP AIMD
  • 网络请求优化:用 Retrofit 拦截器玩转日志、重试与缓存,OkHttp 和 Volley 谁更香?
  • STM32 USBx Device MSC standalone 移植示例 LAT1488
  • Product Hunt 每日热榜 | 2025-08-29
  • typescript postgres@3.x jsonb数据插入绕过类型检测错误问题
  • SwiGLU激活函数的原理
  • TensorFlow 面试题及详细答案 120道(51-60)-- 模型保存、加载与部署