过滤器和拦截器的区别

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

过滤器(Filter)和拦截器(Interceptor)是Java Web开发中常用的请求增强组件,二者都能实现请求预处理、响应后处理的逻辑,但底层归属、执行层级、依赖环境、作用范围存在本质差异,适用场景也截然不同。简单来说:过滤器是Web容器层面的原生组件,拦截器是Spring框架层面的业务组件,二者处于请求处理的不同链路节点。

一、核心定义与底层归属

1.1 过滤器(Filter)

过滤器是Servlet规范(JSR-315)定义的原生Web组件,属于Java EE标准,不依赖任何第三方框架,由Tomcat、Jetty等Web容器直接加载和管理。它的核心作用是对进入容器的所有请求、响应做全局过滤,提前拦截无效请求、统一设置参数,是容器级别的横切逻辑。

实现方式:自定义类实现javax.servlet.Filter接口,重写init()、doFilter()、destroy()三个核心方法,其中doFilter()是核心过滤逻辑。

1.2 拦截器(Interceptor)

拦截器是Spring MVC框架专属的扩展组件,基于Spring AOP思想实现,属于应用层框架组件,必须依赖Spring容器运行,脱离Spring环境无法生效。它的核心作用是对Spring MVC的Controller请求做精细化拦截,聚焦业务层的逻辑增强,是框架级别的横切逻辑。

实现方式:自定义类实现HandlerInterceptor接口,重写preHandle()、postHandle()、afterCompletion()三个方法,分别对应请求执行前、Controller执行后、视图渲染后三个节点。

二、核心维度全方位对比

规范归属

Servlet原生规范,Java EE标准,通用型组件

Spring MVC框架专属,Spring生态扩展,非通用标准

依赖环境

仅依赖Web容器(Tomcat/Jetty),无需Spring

必须依赖Spring容器,脱离Spring无法运行

执行时机

请求进入Web容器后、进入Servlet/DispatcherServlet前执行;响应返回客户端前执行

请求进入DispatcherServlet后、Controller方法执行前后执行;视图渲染完成后执行

作用范围

拦截Web容器所有请求,包括静态资源(HTML/CSS/JS/图片)、动态Servlet请求

仅拦截Spring MVC映射的Controller动态请求,无法拦截静态资源

拦截粒度

粗粒度,只能针对URL路径做拦截,无法精细到Controller方法、参数

细粒度,可针对Controller、请求方法、请求参数做精细化拦截,支持Spring容器资源调用

依赖注入

无法直接使用Spring的依赖注入,需手动获取Bean

由Spring容器管理,可直接注入Service、Dao等Spring Bean

生命周期

随Web容器启动初始化,容器关闭销毁,生命周期由容器管控

随Spring容器启动初始化,容器关闭销毁,生命周期由Spring管控

异常处理

无法捕获Controller层的业务异常,仅能处理容器级异常

可捕获Controller层的业务异常,配合Spring全局异常处理实现统一管控

配置方式

web.xml配置、注解@WebFilter、FilterRegistrationBean注册

实现HandlerInterceptor+注册到WebMvcConfigurer,注解+配置类绑定

三、请求执行流程差异

客户端发起HTTP请求后,执行链路严格遵循过滤器先执行,拦截器后执行的顺序,完整流程如下:

  1. 客户端请求到达Web容器,过滤器doFilter()前置逻辑执行,过滤请求头、参数、路径;
  2. 请求放行后进入DispatcherServlet(Spring MVC核心分发器);
  3. 拦截器preHandle()执行,做业务校验(登录、权限),校验通过则进入Controller;
  4. Controller方法执行业务逻辑,返回ModelAndView;
  5. 拦截器postHandle()执行,处理响应数据、修改视图参数;
  6. 视图渲染完成,拦截器afterCompletion()执行,做资源清理;
  7. 响应返回Web容器,过滤器doFilter()后置逻辑执行,处理响应头、编码;
  8. 响应返回客户端,流程结束。

四、实战场景选型建议

4.1 优先使用过滤器的场景

  • 全局字符编码设置、跨域请求处理(CORS)、请求头统一修改;
  • 静态资源拦截、恶意请求过滤、IP黑名单拦截;
  • 非Spring项目、纯Servlet项目的请求增强;
  • 需要对所有Web请求(含静态资源)做全局处理的场景。

4.2 优先使用拦截器的场景

  • 用户登录校验、接口权限控制、会话管理;
  • Controller层日志打印、接口性能监控、参数校验;
  • 需要调用Spring Bean(Service/Redis工具类)的业务逻辑;
  • 针对特定Controller、接口路径的精细化拦截。

核心总结:过滤器管「容器全局」,拦截器管「Spring业务」;粗粒度全局过滤用Filter,细粒度业务增强用Interceptor,二者可配合使用实现完整的请求管控链路。

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

Spring 文章被收录于专栏

本专栏聚焦Spring全生态体系,从IoC/AOP核心原理入手,覆盖Spring Boot自动配置、事务管理、Web开发等实战内容。拆解循环依赖、动态代理等高频面试难点,助力开发者从入门到精通,打通单体到微服务的技术链路,解决企业级开发痛点,提升架构设计与问题排查能力,成为Java后端进阶的必备技术专栏。

全部评论

相关推荐

面试被问到“Agent”的那一刻,其实很容易露馅。不是不会答,而是——你以为自己会,但一开口,全是概念,没有结构,没有落地。我第一次被问到“什么是ReAct?”的时候,就是这样。一、我第一次被问懵:你说的Agent,到底是什么?那场面试,对方很直接:“你说你做过AI项目,那你解释一下,Agent和普通大模型调用的区别?”我当时脑子里只有几个词:自动化、智能、任务执行……但说出来很虚。后来我才意识到,Agent不是“会说话的模型”,而是“能完成任务的系统”。核心区别只有一句话:👉 大模型 = 给输入 → 出输出👉 Agent = 有目标 → 会规划 → 会行动 → 会反思 → 再行动也就是:从“回答问题”升级到“解决问题”二、什么是ReAct?(不是背定义,是理解逻辑)很多人会背一句:ReAct = Reasoning + Acting但面试官不听定义,他要你讲“它为什么重要”。你可以这么说:ReAct的本质,是让模型在**“思考”和“行动”之间循环”**。不是一口气给答案,而是像人一样:先想(Reason)再做(Act)看结果(Observe)再想(Reason)形成闭环。你可以举个例子(面试特别加分):👉 任务:分析一家公司财务状况传统模型:直接输出一段分析(但可能是胡编的)ReAct Agent:Thought:我需要收入、利润、现金流数据Action:调用数据库 / APIObservation:拿到数据Thought:收入增长但利润下降,可能成本上升Action:继续查成本结构Observation:原材料涨价Final Answer:给出完整分析重点不是步骤,而是:👉 它不假装知道,而是一步步去“找答案”这就是ReAct的价值。三、任务拆解:99%的人都答错的地方面试官接下来一般会问:“那你说说,如果让你设计一个Agent,任务怎么拆?”很多人会说:拆成几个步骤写prompt调接口这不叫拆解。真正的任务拆解,分三层:1️⃣ 目标层(Goal)不是“做什么”,而是“做到什么程度算完成”❌ 分析用户数据✅ 输出用户分层+可执行运营策略2️⃣ 子任务层(Subtasks)拆成“可执行单元”例如:数据获取数据清洗指标计算分群结论生成3️⃣ 能力映射层(Tools / Skills)每个子任务对应能力:子任务对应能力数据获取API / SQL清洗Python分析模型 or 规则输出LLM👉 这一步,才是Agent的核心因为:Agent不是“拆任务”,而是“把任务分配给不同能力”四、设计一个数分Agent(这是面试高频题)如果面试官说:“那你设计一个数据分析Agent?”你可以这样回答(直接结构化输出):🎯 1. 目标定义用户输入一句话:“帮我分析最近用户流失为什么变高”Agent输出:核心原因数据支撑建议动作🧠 2. Agent结构(关键)你可以说三层:① Planner(规划器)拆任务决定先查什么② Executor(执行器)调SQL / Python / API③ Reflector(反思器)判断结果够不够是否继续深挖👉 这一句非常加分:“我会加一个Reflection机制,避免一次性结论错误”🔧 3. 工具设计(落地感)数据库查询工具(SQL)Python分析工具指标计算模块可视化(可选)🔁 4. ReAct流程嵌入每一步都走:ThoughtActionObservation直到:👉 满足“可以解释原因 + 有证据”⚠️ 5. 风险控制(面试加分项)你可以补一句:防 hallucination(必须用真实数据)限制工具调用次数(成本控制)加缓存(性能优化)五、我后来是怎么准备这些问题的?说实话,这一块如果你只是看资料,很难形成“能说出口的结构”。我当时的问题是:👉 我懂一点,但讲不清👉 我会做一点,但没体系👉 一问就乱后来我做了一件很关键的事:我把所有“Agent相关问题”——全部写进简历项目里,然后反推回答。甚至我用了一次工具,把我写的项目拆解成:面试官可能问什么我答得哪里虚哪些点需要补那次帮我优化结构的,就是泡泡小程序AiCV简历王(只提一次),它不是简单改简历,而是把“你说不清的地方”直接暴露出来。很多时候你以为问题在“不会”,其实问题在——你没想清楚。六、面试中我被问到的Agent问题(真实高频)我整理几个你一定会遇到的:1️⃣ “Agent和Workflow的区别?”👉 核心答法:Workflow:固定流程Agent:动态决策一句话总结:👉 Workflow是“写死的流程”👉 Agent是“会自己决定下一步”2️⃣ “什么时候不该用Agent?”这个很多人答不上来。你可以说:任务简单(规则就够)成本敏感实时性要求高👉 本质:Agent不是越智能越好,而是成本是否值得3️⃣ “你怎么评估Agent效果?”高级一点的答法:成功率(任务完成)工具调用次数(效率)成本(token / API)用户满意度4️⃣ “Agent最大的问题是什么?”你可以讲三个:不稳定(输出不一致)成本高调试困难👉 再补一句:“所以我会加日志和轨迹记录(trace)来做调试”直接拉开差距。七、最后一句实话Agent面试,不是考你“会不会用AI”。是考你:👉 能不能把一个复杂问题,拆清楚,并让系统去执行很多人卡住,不是因为不会技术,而是:没结构没闭环没“像人一样思考任务”如果你只能讲“模型怎么用”,那你还在工具层。如果你能讲清:👉 目标 → 拆解 → 执行 → 反馈 → 优化那你才在“系统层”。而面试官,要的是后者。
Agent面试会问什么?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务