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

Filter 和 Interceptor区别

文章目录

    • 区别
    • 适用场景
    • 附:怎么用?

Spring MVC基础知识(包含Filter 和 Interceptor):https://blog.csdn.net/2303_80236475/article/details/146186506?spm=1001.2014.3001.5502
请求完整链路:

浏览器请求 → Tomcat 容器 → Filter(Servlet 规范) → DispatcherServlet → Interceptor(SpringMVC 框架) → Controller

区别

对比维度Filter 过滤器Interceptor 拦截器
规范归属Servlet 原生规范,Tomcat 容器管理SpringMVC 框架组件,Spring 容器管理
执行时机DispatcherServlet之前执行DispatcherServlet之后、Controller 之前执行
拦截粒度拦截所有请求:静态资源、图片、js、jsp、接口只拦截 Controller 控制器请求,不拦截静态资源(默认)
依赖容器不依赖 Spring,纯 Servlet 项目可用必须依赖 SpringMVC,仅 Spring 环境生效
获取对象只能拿到原生ServletRequest/ServletResponse可以拿到 Spring 上下文、Controller 处理器、ModelAndView
拦截时机细分只有doFilter一个方法,放行前后两段逻辑三段方法:preHandle /postHandle/afterCompletion,可操作视图
能否拿到 Controller不能,执行时还没映射处理器可以,handler 参数就是目标 Controller 方法对象
异常捕获只能捕获自身 doFilter 内异常,Controller 异常捕获不到afterCompletion 能接收 Controller 抛出的完整异常
应用场景编码统一设置、跨域、静态资源过滤、全局请求编码登录权限校验、接口日志记录、修改 Model 视图、接口 Token 校验

适用场景

适合用 Filter 实现的功能

  1. 统一设置全局请求编码request.setCharacterEncoding("UTF-8")
  2. CORS 跨域处理(请求到达 Spring 之前就要放行跨域头);
  3. 静态资源缓存、防盗链、文件上传底层预处理;
  4. 处理 Servlet 原生全局请求,不依赖 Spring 环境。

适合用 Interceptor 实现的功能

  1. 基于Controller 方法注解做权限控制(如@LoginRequired@AdminOnly);
  2. 统一向页面 Model 注入全局公共数据;
  3. 打印接口日志:记录请求方法、类名、接口注解、方法参数
  4. 接口 Token 校验,需要调用业务 Service 查询用户信息;
  5. 动态修改返回视图名称。

附:怎么用?

以防忘记怎么用,附个小Demo

过滤器Filter

//@WebFilter("/*")publicclassLoginFilterimplementsFilter{// 容器启动初始化一次@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{System.out.println("Filter 初始化");}// 每次请求都会执行@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{HttpServletRequestreq=(HttpServletRequest)request;System.out.println("Filter 前置逻辑:登录校验");// 放行,执行后续资源(拦截器、Controller)chain.doFilter(request,response);// 响应回来后的后置逻辑System.out.println("Filter 后置逻辑:响应处理");}// 容器销毁执行@Overridepublicvoiddestroy(){System.out.println("Filter 销毁");}}

Interceptor 拦截器

publicclassLoginInterceptorimplementsHandlerInterceptor{// 1. Controller 执行前,返回false直接拦截请求@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println("Interceptor preHandle:登录校验");// true放行;false拦截,不会进入Controllerreturntrue;}// 2. Controller执行完,视图渲染前@OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{System.out.println("Interceptor postHandle:修改视图数据");}// 3. 视图渲染完成后,最后执行(异常也会走这里)@OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{System.out.println("Interceptor afterCompletion:资源释放、异常记录");}}
http://www.jsqmd.com/news/1243036/

相关文章:

  • 老师傅30分钟拆一台设备,新人拆了3小时——差距不在手上,在经验传承
  • Filmulator核心功能深度解析:从动态范围压缩到局部对比度增强
  • 2026年7月最新石家庄市鹿泉区亨得利官方名表服务中心电话公示 - 亨得利官方博客
  • DBdeployer高级特性:Group Replication与PXC集群部署
  • 小米开源项目技术解析与应用实践
  • 从0到1搭建namae本地开发环境:前端工程师实战教程
  • 深入解析ARM Cortex-M4引脚复用:从数据手册到软硬件协同设计实战
  • 鸿蒙 ArkTS 实战:Calorie Burn Estimator 从运动热量到运动消耗应用完整解析
  • 三星 Z Fold 8 Ultra 即将发布:延续纤长设计,5000mAh 电池视频播放最长 27 小时
  • 嵌入式系统可靠性设计:复位、看门狗与NMI机制深度解析
  • 告别视觉疲劳:为什么开发者都在用visualstudio-colors-solarized主题?
  • AirModel实战教程:基于PostgreSQL的异步ORM轻松上手
  • JVM(Java虚拟机)详解
  • Gazelle高性能用户态网络协议栈:解锁数据库网络性能20%+的加速秘诀
  • 成都家政服务全域覆盖能力升级 本土直营品牌下沉区县街道 - GrowUME
  • 【紧急预警】Runway即将下线免费面部替换API接口(倒计时17天):迁移至Enterprise Tier的5种低成本替代方案,含自建ControlNet+InsightFace轻量化部署手册
  • 5GNR 初始接入流程完整图解(持续更新)——小区搜索
  • 学生护眼灯买什么样的好?学生适用护眼台灯推荐,写作业更适配
  • Solarized主题全家桶:dotfiles44/dotfiles实现vim+tmux+iterm配色统一
  • Hermes Agent 长期记忆:MEMORY.md、USER.md 与跨会话召回,告别重复解释
  • Dioxus:三行代码开发跨平台应用,多平台支持与全栈功能助力高效开发!
  • arrow.nvim高级用户指南:分割窗口打开书签文件的技巧
  • Jellium Desktop界面语言包创建:添加新的界面语言
  • Python毕设项目:个性化资讯订阅与新闻更新提醒系统 网络新闻数据挖掘与展示订阅平台(源码+文档,讲解、调试运行,定制等)
  • 嵌入式系统开发及应用(中级)交互式教程
  • [具身智能-616]:相机图像传感器、相机ISP、RDK X5的推理单元、openCV底层库,GPU,他们在图像处理中各自的输入和输出格式?
  • 终极跨平台B站客户端:wiliwili完整使用指南
  • Revo框架配置与部署完全指南:从开发到生产环境
  • 终极指南:用wiliwili在游戏机上享受完整的B站体验
  • Rust AI 数据清洗 CLI:把非结构化日志用模型转成结构化 JSON 的方案