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

过滤器和拦截器的区别?

过滤器(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.dtcms.com/a/356615.html

相关文章:

  • 企业内网与互联网网络安全改造升级深度解析
  • Elasticsearch AI 语义搜索(semantic_text)
  • eslasticsearch+ik分词器+kibana
  • Linux系统部署:Certbot 实现 Nginx 自动续期部署 Let‘s Encrypt 免费 SSL 证书
  • matlab矩阵生成stl格式文件,适用于多孔介质图形生成
  • IAR工程如何生成compile_commands.json文件(能生成但是clangd不能生成“.cache文件”)
  • Spark算子调优
  • AAA服务器
  • Mock 在 API 研发中的痛点、价值与进化及Apipost解决方案最佳实践
  • 3.1 DataStream API 编程模型
  • YARN架构解析:深入理解Hadoop资源管理核心
  • Ubuntu 服务器 KERNEL PANIC 修复实录
  • Java-面试八股文-Mysql篇
  • 【前端教程】从性别统计类推年龄功能——表单交互与数据处理进阶
  • IDEA之GO语言开发
  • cssword属性
  • 深度拆解 OpenHarmony 位置服务子系统:从 GNSS 到分布式协同定位的全链路实战
  • 20250829_SQLserver数据库_Server ip10.5.7.44在客户端用Navicat创建一个WATDB_ANDON数据库下的只读用户
  • 【小白笔记】Visual Studio 在 2025年7月更新的功能说明(英文单词记忆)
  • 软考 系统架构设计师系列知识点之杂项集萃(135)
  • TF-IDF:文本分析的“火眼金睛”
  • 绿幕电商直播为什么要用专业抠图软件.
  • 新手向:从零开始理解百度语音识别API的Python实现
  • CLion 中配置运行 Qt 项目指南
  • C++ 高阶错误解析:MSVC 与 Qt 全景指南
  • 如何设置阿里云轻量应用服务器镜像?
  • Maya绑定:连接编辑器的简单使用
  • 卷积理解-excel数据图表演示
  • 开源大语言模型(Qwen3)
  • 基于Velero + 阿里云 OSS的Kubernetes 集群的备份与恢复