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

Java Web 拦截机制实战指南:Filter 与 Interceptor 深度解析

一、理解核心概念在 Java Web 开发中过滤器Filter和拦截器Interceptor是两种核心的请求处理机制。它们虽然都能对请求进行拦截和处理但定位截然不同Filter是 Servlet 容器的守门人位于应用最外层Interceptor是 Spring MVC 的执法官位于框架内部二、FilterServlet 容器的第一道防线2.1 本质与特点Filter 是Java Servlet 规范定义的组件由 Servlet 容器如 Tomcat直接管理不依赖任何框架因此具有最强的通用性。生命周期方法方法触发时机用途init()应用启动时初始化配置doFilter()每次请求核心处理逻辑destroy()应用关闭时资源释放执行流程请求 → Filter1 → Filter2 → Servlet/Controller → Filter2 → Filter1 → 响应2.2 Spring Boot 中的实现方式方式一注解方式适合简单场景WebFilter(urlPatterns /api/*, filterName authFilter) public class AuthFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 前置处理 System.out.println(认证检查开始); // 放行到下一个 Filter 或目标资源 chain.doFilter(request, response); // 后置处理响应返回时执行 System.out.println(认证检查结束); } } // 在主类开启扫描 SpringBootApplication ServletComponentScan public class Application { }方式二配置类方式推荐更灵活Configuration public class FilterConfig { Bean public FilterRegistrationBeanAuthFilter authFilter() { FilterRegistrationBeanAuthFilter bean new FilterRegistrationBean(); bean.setFilter(new AuthFilter()); bean.addUrlPatterns(/api/*); bean.setOrder(1); // 控制执行顺序数字越小越先执行 return bean; } }2.3 Filter 的典型应用场景场景说明统一编码设置 UTF-8 编码解决中文乱码安全防护XSS 过滤、SQL 注入检测跨域处理添加 CORS 响应头请求日志记录所有请求的 IP、路径、耗时数据压缩Gzip 压缩响应内容三、InterceptorSpring MVC 的精准拦截3.1 本质与特点Interceptor 是Spring MVC 框架提供的机制只能拦截被DispatcherServlet处理的请求即映射到 Controller 的请求。它可以获取 Spring 上下文与业务逻辑深度集成。三个核心拦截点方法执行时机能否终止请求典型用途preHandle()Controller 方法执行前可返回false终止登录验证、权限校验postHandle()Controller 执行后视图渲染前无法终止修改 Model、添加公共数据afterCompletion()请求处理完成含异常无法终止资源清理、异常日志3.2 完整实现示例Component public class PermissionInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 获取请求信息 String uri request.getRequestURI(); System.out.println(【拦截】请求路径: uri); // 权限校验逻辑 HttpSession session request.getSession(); if (session.getAttribute(user) null uri.startsWith(/admin)) { response.sendRedirect(/login); return false; // 拦截不继续执行 } return true; // 放行 } Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 向视图添加通用数据 if (modelAndView ! null) { modelAndView.addObject(serverTime, new Date()); } } Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 记录异常信息 if (ex ! null) { System.out.println(【异常】请求处理出错: ex.getMessage()); } // 清理 ThreadLocal 等资源 } }注册 InterceptorConfiguration public class WebMvcConfig implements WebMvcConfigurer { Autowired private PermissionInterceptor permissionInterceptor; Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(permissionInterceptor) .addPathPatterns(/admin/**, /user/**) // 拦截路径 .excludePathPatterns(/login, /public/**); // 排除路径 } }四、核心区别对比对比维度FilterInterceptor规范来源Servlet 规范J2EESpring MVC 框架框架依赖不依赖 Spring任何 Web 应用可用必须在 Spring 环境中使用拦截范围所有请求含静态资源、JSP仅 DispatcherServlet 映射的请求执行时机Servlet 之前Controller 前后方法数量1 个doFilter()3 个preHandle、postHandle、afterCompletion可获取对象ServletRequest、ServletResponseHttpServletRequest、HandlerMethod、ModelAndView异常处理只能捕获 Filter 内部异常afterCompletion可捕获 Controller 异常静态资源拦截支持默认不支持五、执行顺序详解当 Filter 和 Interceptor 同时存在时执行流程如下1. Filter.doFilter() 前置代码 ↓ 2. Interceptor.preHandle() ↓ 3. Controller 方法执行 ↓ 4. Interceptor.postHandle() ↓ 5. 视图渲染 ↓ 6. Interceptor.afterCompletion() ↓ 7. Filter.doFilter() 后置代码示意图请求进入 ↓ [Filter 1] ──┐ ↓ │ [Filter 2] │ 过滤器链双向拦截 ↓ │ [Servlet] │ ↓ │ [Interceptor 1.preHandle] ──┐ ↓ │ [Interceptor 2.preHandle] │ ↓ │ [Controller 执行] │ 拦截器链三阶段 ↓ │ [Interceptor 2.postHandle] │ ↓ │ [Interceptor 1.postHandle] │ ↓ │ [视图渲染] │ ↓ │ [Interceptor 1.afterCompletion]┘ ↓ [Interceptor 2.afterCompletion] ↓ [Filter 2 后置] ↓ [Filter 1 后置] ↓ 响应返回六、实战选择指南6.1 优先使用 Filter 的场景统一字符编码需要在请求进入 Servlet 前就设置编码跨域处理CORS处理OPTIONS预检请求早于 Spring MVC安全过滤XSS、SQL 注入的输入预处理全局日志记录所有 HTTP 请求的完整生命周期非 Spring 环境纯 Servlet 应用6.2 优先使用 Interceptor 的场景登录状态校验可便捷获取HttpSession和 Spring Bean细粒度权限控制结合PreAuthorize、Security 上下文性能监控精确统计 Controller 执行时间业务操作日志获取HandlerMethod知道调用了哪个方法视图数据增强在postHandle中向 Model 添加数据七、黄金组合实践在实际项目中两者配合使用才能发挥最大价值层级组件职责外层Filter编码设置、CORS、XSS 过滤、请求日志内层Interceptor登录验证、权限校验、性能监控、业务日志典型配置示例// Filter 处理通用底层逻辑 Bean public FilterRegistrationBeanCharacterEncodingFilter encodingFilter() { FilterRegistrationBeanCharacterEncodingFilter bean new FilterRegistrationBean(); bean.setFilter(new CharacterEncodingFilter(UTF-8, true)); bean.addUrlPatterns(/*); bean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 最先执行 return bean; } // Interceptor 处理业务逻辑 Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns(/api/**) .excludePathPatterns(/api/login); }八、面试高频问题Q1Filter 和 Interceptor 的本质区别是什么Filter 是 Servlet 规范由容器管理Interceptor 是 Spring MVC 机制由框架管理。Filter 更早执行能拦截所有请求Interceptor 更晚执行只能拦截 Spring MVC 请求但能获取更丰富的上下文。Q2如何让 Interceptor 拦截静态资源修改DispatcherServlet的url-pattern为/*但会带来性能开销通常不建议。静态资源拦截建议用 Filter。Q3afterCompletion一定会执行吗只要preHandle返回true并执行了无论后续是否异常afterCompletion都会执行适合资源清理。Q4如何控制多个 Filter 的执行顺序使用FilterRegistrationBean的setOrder()方法数字越小优先级越高。九、总结FilterInterceptor定位容器层护城河框架层城门守卫优势通用、底层、无框架依赖精细、灵活、可获取 Spring 上下文最佳实践处理通用、底层问题处理业务、安全、监控逻辑核心原则Filter 做通用处理Interceptor 做业务拦截两者协同构建完整的请求处理体系。

相关文章:

Java Web 拦截机制实战指南:Filter 与 Interceptor 深度解析

一、理解核心概念在 Java Web 开发中,过滤器(Filter)和拦截器(Interceptor)是两种核心的请求处理机制。它们虽然都能对请求进行拦截和处理,但定位截然不同:Filter 是 Servlet 容器的"守门人…...

Alibaba DASD-4B Thinking 对话工具 ComfyUI 工作流解读:节点连接与参数优化

Alibaba DASD-4B Thinking 对话工具 ComfyUI 工作流解读:节点连接与参数优化 如果你已经玩了一段时间 Stable Diffusion,对 WebUI 的基础操作感到得心应手,甚至开始觉得有些“施展不开”,那么是时候认识一下 ComfyUI 了。它不像 …...

SolidWorks与Maxwell协同设计:三维平板螺旋线圈的桥接建模技巧

1. 为什么需要SolidWorks与Maxwell协同设计 在电磁场仿真领域,Maxwell作为行业标杆软件,其强大的求解器能够精确模拟各种电磁现象。但很多工程师都遇到过这样的尴尬:明明脑子里已经构思好了线圈结构,却在Maxwell的建模界面里束手无…...

Windows10配置MinGW-w64完整指南(附镜像加速方案)

1. MinGW-w64简介与下载加速方案 MinGW-w64是Windows平台最常用的GNU编译器集合(GCC)移植版本,它允许你在Windows系统上编译原生的C/C程序。与传统的MinGW相比,MinGW-w64支持更现代的C标准(如C17/20)&#…...

TranslateGemma一键部署教程:基于Linux系统快速搭建多语言翻译平台

TranslateGemma一键部署教程:基于Linux系统快速搭建多语言翻译平台 1. 开篇:为什么选择TranslateGemma? 如果你正在寻找一个既强大又易用的翻译解决方案,TranslateGemma绝对值得一试。这个基于Gemma 3构建的翻译模型&#xff0c…...

nlp_structbert_sentence-similarity_chinese-large 在社交网络中的应用:发现相似兴趣社群

nlp_structbert_sentence-similarity_chinese-large 在社交网络中的应用:发现相似兴趣社群 你有没有想过,为什么有些社交平台总能把你推荐给一群聊得来的人?或者,一个刚加入的兴趣小组,里面的讨论氛围却让你感觉像回家…...

【效率提升指南】一键配置VS/VSCODE注释模板与版权声明

1. 为什么你需要注释模板? 每次新建代码文件都要手动敲一遍版权声明和作者信息?团队协作时总有人忘记写注释导致代码难以维护?作为写过上百万行代码的老司机,我见过太多因为注释不规范引发的"血案"。最夸张的一次是接手…...

【Dify多智能体协同避坑红宝书】:20年架构师亲历的5大致命陷阱与实时修复方案

第一章:Dify多智能体协同避坑指南的底层逻辑与认知框架Dify 的多智能体(Multi-Agent)协同能力并非简单地将多个 LLM 节点串联,而是基于**任务分解—角色绑定—状态感知—反馈闭环**四维耦合的认知框架构建。其底层依赖于 Dify Run…...

从零到一!CWRU轴承数据集Python实战:数据加载、预处理与特征工程全解析

1. CWRU轴承数据集入门指南 第一次接触CWRU轴承数据集时,我也被它庞大的数据量和复杂的目录结构搞得晕头转向。这个由美国凯斯西储大学发布的经典数据集,包含了从正常运转到各种故障状态的轴承振动信号,是机械故障诊断领域的"MNIST"…...

BMS工程师的“技能栈自杀“:四个战场决定你是算法殖民者还是被殖民者

开篇:35岁BMS工程师正在经历"技术折旧" "你不是被AI取代,你是被会用AI的25岁工程师取代。" 猎聘2024Q3数据显示:传统BMS嵌入式工程师平均薪资涨幅已跌至3.2%(跑输通胀),而具备AI算法…...

Tenet:重新定义Minecraft服务器体验的混合架构解决方案

Tenet:重新定义Minecraft服务器体验的混合架构解决方案 【免费下载链接】Tenet Minecraft Forge Hybrid server implementing the Spigot/Bukkit API, formerly known as Thermos/Cauldron/MCPC 项目地址: https://gitcode.com/gh_mirrors/mo/Tenet 在Minecr…...

我可以直接把轴承的点云特征向量化,直接对比余弦差查询不就知道这个零件是不是轴承了 甚至不用训练

你的想法——将点云特征直接向量化并通过余弦相似度进行匹配——在理论上是成立的,这也是3D形状检索(3D Shape Retrieval)领域一个常见且有效的方法,称为 "基于嵌入的检索" (Embedding-based Retrieval)。 然而&#x…...

CesiumJS 实战:打造动态呼吸脉冲围栏(含发光线与闪烁点)

在三维地理可视化项目中,电子围栏(Geo-fence) 是一个常见需求。但静态围栏缺乏视觉冲击力。本文将带你使用 CesiumJS 构建一个 带呼吸脉冲效果的动态围栏系统,包含:🌊 墙体呼吸动画💡 底部发光轮…...

OpenClaw技能市场挖掘:QwQ-32B支持的5个实用自动化插件

OpenClaw技能市场挖掘:QwQ-32B支持的5个实用自动化插件 1. 为什么需要关注OpenClaw技能市场? 第一次接触OpenClaw时,我被它"本地化AI助手"的定位吸引,但真正让我感到惊艳的是它的技能市场(ClawHub&#xf…...

大模型微调新选择:Llama Factory可视化工具使用体验分享

大模型微调新选择:Llama Factory可视化工具使用体验分享 1. 工具概览 Llama Factory是一款专为大模型微调设计的可视化工具,它让原本复杂的模型训练过程变得简单直观。这个工具最大的特点就是"零代码"——用户不需要编写任何代码就能完成从数…...

性能优化工具矩阵:从系统瓶颈到效率提升的全栈解决方案

性能优化工具矩阵:从系统瓶颈到效率提升的全栈解决方案 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atla…...

网盘资源搜索工具使用体验分享

最近在找一些学习资料和影视资源时,试用了几个网盘搜索网站,记录下使用体验,希望能帮到有同样需求的朋友。 竹云盘搜(zhuyunso.top) 这个站给我的第一印象就是简洁。打开页面就一个搜索框,没有任何弹窗广…...

6-2一帮一

“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学…...

WSL2新手必看:VcXsrv配置xfce4图形界面的5个常见错误及解决方法

WSL2图形化实战:避开VcXsrv与xfce4配置的五大深坑 第一次在WSL2中看到xfce4桌面环境成功加载时的兴奋,很快被接踵而至的报错信息冲淡——这可能是许多开发者的真实写照。作为连接Windows与Linux生态的桥梁,WSL2的图形界面配置过程中暗藏着不…...

ZLMediaKit编译webrtc:从依赖版本到端口映射的实战避坑指南

1. 环境准备:云服务器选型与基础配置 在Autodl这类云服务器上编译ZLMediaKit,首先要解决的是环境适配问题。我实测过阿里云、腾讯云等多种云服务商,发现Autodl这类提供GPU实例的平台有个共性特点:默认环境干净到近乎"裸奔&qu…...

winServer系统重:Windows IIS服务器安装

一、打开服务器管理器 Windows搜索“服务器管理器”,直接进入。找不到“服务器管理器”要怎么办呢? 先不要慌,参考我下一篇文章即可。https://blog.csdn.net/Leewayah/article/details/131683594 ​ 二、点击右上角的“管理” ​ 三、点击…...

【边缘AI部署生死线】:为什么你的C节点总在OTA升级时崩溃?——静态链接剥离、符号表裁剪与段重定向三重编译加固术

第一章:C语言边缘计算节点轻量化编译方法概论在资源受限的边缘计算场景中,C语言因其零成本抽象、内存可控性及广泛工具链支持,成为构建轻量级节点程序的首选。然而,传统编译流程常引入冗余符号、未使用库函数及调试信息&#xff0…...

软件测试基础5天学习总结(思维导图)

...

MoE 架构:给 AI 找 8 个 “专属专家“ 打工,效率直接拉满!

MoE(混合专家模型)是一种高效的大模型架构设计范式,核心思想是用多个"专家"模型分工处理不同类型的输入,再通过门控网络整合结果,既能提升模型容量,又能控制计算成本。下面从基础概念、核心原理、…...

REX-UniNLU与Python爬虫结合:零样本语义分析实战指南

REX-UniNLU与Python爬虫结合:零样本语义分析实战指南 1. 场景引入:当爬虫遇到语义理解 电商公司的运营小张最近遇到了一个头疼的问题:他们用爬虫收集了上万条竞品评论数据,但面对海量的文本信息,手动分析变得几乎不可…...

漫画脸描述生成效果展示:时间维度角色演变(‘三年后’‘转生后’‘黑化后’设定生成)

漫画脸描述生成效果展示:时间维度角色演变 基于Qwen3-32B的二次元角色设计工具,让角色随"时间"生动演变 1. 引言:当漫画角色穿越时间线 你有没有想过,自己创作的漫画角色在"三年后"会变成什么模样&#xff1…...

Unity中InputField光标位置精准控制与焦点保持技巧

1. 为什么需要精确控制InputField光标位置? 在Unity开发中,InputField是最常用的UI组件之一,特别是需要用户输入文本的场景。但很多开发者都遇到过这样的困扰:当我们需要通过代码动态修改InputField内容时,光标位置经常…...

为什么你的PADS Layout泪滴添加不成功?可能是这5个细节没注意

为什么你的PADS Layout泪滴添加总失败?5个工程师不愿透露的细节 在PCB设计领域,泪滴(Teardrop)是连接焊盘与走线之间的过渡结构,它能有效增强机械强度、改善信号完整性和提高生产工艺良率。但许多设计师在使用PADS Lay…...

电动汽车时代必看:用新版APQP第三版搞定电池供应链质量管控

电动汽车时代必看:用新版APQP第三版搞定电池供应链质量管控 当特斯拉的4680电池量产遇到瓶颈时,工程师们发现传统质量控制方法在新型电池体系面前显得力不从心。这正是新能源汽车行业面临的典型挑战——当技术迭代速度远超标准更新周期,质量管…...

LFM2.5-1.2B-Thinking模型迁移学习实战:领域适配指南

LFM2.5-1.2B-Thinking模型迁移学习实战:领域适配指南 1. 引言 你是不是曾经遇到过这样的情况:好不容易找到一个性能不错的AI模型,但在自己的专业领域使用时,效果总是不尽如人意?比如用通用模型来处理医疗报告、法律文…...