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

详细讲解 Spring MVC 的 HandlerInterceptor 接口

目录一、核心定位二、接口完整定义三、三个核心方法详解执行顺序 作用1. preHandle () —— 【请求前置处理】2. postHandle () —— 【请求后置处理】3. afterCompletion () —— 【请求完成清理】四、执行流程生命周期多个拦截器执行顺序五、常用实现方式方式 1直接实现 HandlerInterceptor方式 2继承 HandlerInterceptorAdapter已废弃六、拦截器注册配置关键常用配置项七、拦截器 VS 过滤器Filter八、经典使用场景九、注意事项总结HandlerInterceptor是Spring MVC 核心的拦截器接口作用类似于 Web 开发中的过滤器Filter但更贴合 Spring MVC 生命周期专门用于对控制器Controller请求进行预处理、后处理、完成清理。简单说它可以在请求进入 Controller 之前、Controller 执行完毕之后、页面渲染完成之后三个节点插入自定义逻辑。一、核心定位属于 Spring MVC 组件只拦截进入控制器的请求不拦截静态资源可配置基于AOP 思想实现请求的横向切面处理日志、登录校验、权限控制等是一个接口开发时需要实现它并重写方法必须注册到 Spring MVC 容器才能生效二、接口完整定义public interface HandlerInterceptor { // 1. 请求进入 Controller 之前执行预处理 default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } // 2. Controller 执行完毕视图渲染之前执行后处理 default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } // 3. 整个请求完全结束视图渲染完毕后执行清理 default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }三个方法都是default空实现实现类可以按需重写不用全部实现。三、三个核心方法详解执行顺序 作用1. preHandle () —— 【请求前置处理】执行时机DispatcherServlet收到请求 → 找到对应 Controller →执行 Controller 方法之前核心作用登录校验、权限校验请求日志记录参数校验、请求头校验拦截非法请求直接返回响应返回值true放行继续执行后续拦截器 Controllerfalse拦截请求终止不会进入 Controller参数说明handler实际要执行的处理器Controller 方法2. postHandle () —— 【请求后置处理】执行时机Controller 方法执行完毕 →返回 ModelAndView 之后→视图JSP/Thymeleaf渲染之前核心作用统一修改响应数据往 Model 中添加公共数据全局变量对 Controller 返回结果做统一处理注意如果 Controller 抛出异常此方法不会执行多个拦截器时执行顺序与preHandle相反3. afterCompletion () —— 【请求完成清理】执行时机整个请求完全结束视图渲染完成 / 请求响应完毕之后核心作用资源清理关闭流、删除临时文件记录请求耗时统一异常日志记录特点无论是否抛出异常一定会执行适合做最终收尾工作四、执行流程生命周期一次完整请求的执行顺序请求 → preHandle() → Controller 执行 → postHandle() → 视图渲染 → afterCompletion() → 响应结束多个拦截器执行顺序假设配置了 3 个拦截器A、B、CpreHandleA → B → CController执行postHandleC → B → AafterCompletionC → B → A栈结构先进后出五、常用实现方式方式 1直接实现 HandlerInterceptorComponent public class LoginInterceptor implements HandlerInterceptor { // 登录校验 Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 从 session 获取用户信息 Object user request.getSession().getAttribute(loginUser); if (user null) { // 未登录拦截并跳转 response.sendRedirect(/login); return false; } // 已登录放行 return true; } }方式 2继承 HandlerInterceptorAdapter已废弃Spring 5 之后推荐直接实现接口接口支持 default 方法不再使用适配器。六、拦截器注册配置关键拦截器必须注册才能生效使用WebMvcConfigurer配置Configuration public class WebConfig implements WebMvcConfigurer { Autowired private LoginInterceptor loginInterceptor; Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor) .addPathPatterns(/**) // 拦截所有请求 .excludePathPatterns( // 放行请求 /login, /register, /static/**, // 静态资源 /error ); } }常用配置项addPathPatterns(/**)拦截所有请求excludePathPatterns(/login)排除不拦截的路径order(1)设置拦截器执行顺序数字越小越先执行七、拦截器 VS 过滤器Filter这是面试高频考点必须区分清楚表格对比项HandlerInterceptor拦截器Filter过滤器所属容器Spring MVC 容器Servlet 容器拦截范围只拦截 Controller 请求拦截所有 Web 请求包括静态资源执行时机Spring 容器初始化之后Servlet 容器加载之前依赖 Spring强依赖可使用 Spring 所有 Bean不依赖 Spring方法粒度3 个方法精细控制1 个 doFilter 方法使用场景登录、权限、日志、统一结果编码、跨域、限流、请求包装总结Spring Web 项目优先用HandlerInterceptor通用 Web 功能编码、跨域用Filter八、经典使用场景登录认证未登录拦截跳转登录页权限控制校验用户是否有权限访问接口接口日志记录请求路径、参数、耗时、返回结果防重复提交接口幂等性控制全局数据注入给所有页面注入公共参数请求限流接口访问频率控制九、注意事项preHandle 返回 false 必须处理响应否则浏览器会空白静态资源js/css/img一定要排除否则会被拦截拦截器中异常尽量自己捕获避免影响主流程不要在拦截器中做耗时操作会拖慢请求多个拦截器注意order顺序总结HandlerInterceptor是 Spring MVC请求拦截器用于切面处理 Controller 请求核心 3 个方法preHandle前置、postHandle后置、afterCompletion清理必须实现接口 注册配置才能生效适合做登录、权限、日志、公共数据注入等横向逻辑区别于 Filter更轻量、贴合 Spring、粒度更细

相关文章:

详细讲解 Spring MVC 的 HandlerInterceptor 接口

目录 一、核心定位 二、接口完整定义 三、三个核心方法详解(执行顺序 作用) 1. preHandle () —— 【请求前置处理】 2. postHandle () —— 【请求后置处理】 3. afterCompletion () —— 【请求完成清理】 四、执行流程(生命周期&a…...

Godot 4.3 RTS开发实战:事件驱动架构与指令队列优化

1. 这不是又一个“Hello World”教程:RTS游戏在Godot里到底难在哪?你点开过十几个“Godot RTS教程”,结果发现前两分钟还在画UI按钮,第三分钟就跳到“接下来我们用NavigationServer实现寻路”——然后卡住。你翻遍官方文档&#x…...

固始汽车贴膜口碑榜:前3名都有谁?

老铁们,最近固始的车友群里吵翻了,都在问“固始汽车贴膜哪家好”。十个有八个刚提了新车,第一个想到的就是去贴个膜,但这一脚踩下去,水深得很。我直接跟你们说个扎心的事实:固始街头随便找家店,…...

Godot RTS开发实战:从导航到建造的原子化实现

1. 为什么“从零开始玩转Godot RTS引擎”不是一句空话,而是真能落地的开发路径很多人看到“RTS”两个字母就下意识缩手——星际争霸、帝国时代、红色警戒这些名字背后是庞大的系统、复杂的寻路、海量单位同步、资源采集逻辑、建造队列、科技树、视野遮蔽……一连串术…...

Godot 4.x RTS游戏开发实战:从MVP内核到千单位性能优化

1. 这不是又一个“Godot入门教程”,而是一份专为RTS开发者准备的实战切片你有没有试过在Godot里拖一个Unit节点,加个move_and_slide(),然后兴冲冲地拉出十个单位——结果它们像被磁铁吸住一样挤成一团,路径重叠、碰撞卡死、指令延…...

Godot开发RTS游戏的实战优化指南

1. 为什么说“用Godot做RTS”不是噱头,而是被低估的务实选择很多人第一次听说“用Godot开发即时战略游戏”,第一反应是皱眉——毕竟Unity和Unreal在大型3D项目上的生态优势太显眼,而传统RTS又以单位数量多、逻辑密集、网络同步严苛著称。我20…...

Unity哥特UI资源包:SDF字体与Shader Graph工程化实践

1. 为什么哥特UI在游戏开发中长期被低估,又为何现在必须认真对待“哥特UI”这个词,很多Unity开发者第一反应是:不就是黑底、尖角、浮雕字、带玫瑰纹样的按钮吗?配个暗红渐变完事。我2019年接手一个中世纪黑暗奇幻RPG时也这么想——…...

微信社群开发wechat ipad协议

WTAPI框架wechat ipad协议 微信社群开发,开发微信机器人/微信个人号二次开发你可以 通过WTAPI 框架实现 个性化微信功能 (例云发单助手、社群小助手、客服系统、机器人等),用来自动管理微信消息。用户仅可一次对接,完善…...

UPGEN Lighting HDRP:HDRP光照优化与自动化配置方案

1. 这不是又一个“开箱即用”的灯光插件,而是HDRP光照工程的系统性减负方案我第一次在项目里把UPGEN Lighting HDRP拖进Assets文件夹时,并没指望它能解决什么大问题——毕竟Unity官方HDRP模板里自带的Light Explorer、Light Probe Group、Reflection Pro…...

HDRP光照性能优化:探针体内存、阴影贴图与反射烘焙的底层控制

1. 这不是又一个“灯光插件”,而是HDRP光照工作流的手术刀我第一次在客户项目里看到UPGEN Lighting HDRP,是在一个实时虚拟制片场景的紧急优化现场。美术总监指着渲染帧率从28fps掉到14fps的监控面板说:“灯光一开,GPU就喘不上气—…...

Unity Crest海洋系统跨渲染管线适配指南:BIRP/URP/HDRP深度解析

1. 这不是“换个Shader就能跑”的事:Crest海洋系统在现代Unity管线中的真实适配困境Crest海洋系统——这个在Unity生态里被反复提及、被无数海景Demo反复验证的高质量水体解决方案,从诞生之初就带着一个隐性前提:它原生构建于Built-in Render…...

SpaceX启动纳斯达克IPO,1.75万亿美元市值目标能否实现?

SpaceX启动纳斯达克IPO5月21日,马斯克旗下的商业航天、通信与AI巨头SpaceX向美国SEC公开提交S - 1注册声明,启动纳斯达克IPO流程。其承销商包括高盛、摩根士丹利、美国银行证券、花旗、摩根大通证券。这版S - 1文件暂未披露具体的发行股数和定价区间。不…...

pytest Code Review skill.md

Skills 架构设计 本文深入探讨 Agent Skills 的技术架构和设计理念,帮助你理解 Skills 如何高效地扩展 Claude 的能力。 核心设计理念 Agent Skills 采用**渐进式披露(Progressive Disclosure)**架构,这是一种现代软件工程中的…...

Unity游戏配置管线实战:Luban Schema与Data分离设计

1. 为什么表格配置不是“偷懒”,而是Unity项目规模化生存的刚需在Unity游戏开发里,我见过太多团队把角色属性、武器参数、任务对话全写死在C#脚本里——刚上线时改个血量要改三处代码,策划提个新武器需求得等程序员下班后加字段,版…...

解锁洛可可美学密码:用Midjourney V6实现蓬巴杜夫人级繁复纹样、柔光质感与粉金配色的5步精准控制法

更多请点击: https://intelliparadigm.com 第一章:洛可可美学的数字转译本质与Midjourney V6语义解码机制 洛可可美学以繁复卷曲的曲线、轻盈的不对称构图、粉金柔色调与自然母题(如贝壳、藤蔓、云朵)为标志,其核心并…...

Angular Signal Forms:以状态为先,革新表单验证、UI 更新与状态管理

Angular Signal Forms:为表单管理引入以状态为先的模型表单通常是前端应用中状态最复杂的部分,负责捕获用户输入、运行验证逻辑、跟踪交互状态,并协调更改在 UI 中传播。随着表单规模增大,保持内容同步所需代码量会迅速增加。Angu…...

工具调用优化:减少API延迟对Agent性能的影响

《工具调用优化全指南:彻底解决API延迟拖累大模型Agent性能的痛点》 副标题:从原理到落地,覆盖缓存、并行、调度、轻量化改造全链路可复现方案 第一部分:引言与基础 1.1 摘要/引言 你有没有遇到过这种场景:辛辛苦苦开发的智能Agent功能非常强大,能查订单、搜资料、算数…...

从拉灯呼叫到闭环处理:安灯管理软件操作流程能解决哪些场景痛点?一套安灯管理软件操作流程实战

在制造工厂的生产现场,异常就像不速之客,总在最忙的时候敲门。设备突然停机、物料没送到位、质量出现批量不良……这些异常发生后,最让人头疼的往往不是问题本身,而是处理问题的过程。工人发现设备停了,扯着嗓子喊班长…...

Unity军事资源包的战术语义架构与实战集成指南

1. 这个资源包不是“拿来就能用”的万能钥匙,而是需要你亲手校准的战术装备“POLYGON Military”——光看名字,很多人第一反应是:Unity Asset Store上那个标着“POLYGON”风格、封面全是迷彩涂装M4和悍马车的军事资源包。它确实存在&#xff…...

POLYGON Military资源包:军事仿真级3D资产的精度逻辑与战术应用

1. 这个资源包不是“拿来就能用”的万能钥匙,而是军事仿真级资产的起点你刚在Unity Asset Store页面看到POLYGON Military资源包封面——几辆写实风格的装甲车停在沙尘弥漫的战壕边,一个全副武装的士兵正蹲姿持枪警戒,远处是半坍塌的混凝土掩…...

Unity Low Poly动物资源包:性能优化与开箱即用实践指南

1. 这个Low Poly Animated Animals资源包到底解决了什么问题?在Unity项目开发中,尤其是独立游戏、教育模拟、原型验证或轻量级AR应用里,我见过太多团队卡在“生态感”这个看似简单实则棘手的环节上。不是没有动物模型——恰恰相反&#xff0c…...

Quark:极致微型Linux卡片电脑的硬件设计、系统开发与应用实战

1. 项目概述:当“小”成为核心竞争力在嵌入式开发和创客圈子里,我们总在寻找那个“刚刚好”的硬件平台。它要足够小巧,能塞进任何灵光一现的创意里;它要足够完整,能运行一个正经的操作系统来处理复杂逻辑;它…...

Selenium Cookie复用登录态实战指南

1. 这不是“绕过”,而是“复用登录态”——先厘清一个关键认知误区很多人看到“Selenium通过cookie绕过验证码”这个标题,第一反应是:又一个黑灰产技巧?能省事就上?但我在电商、金融、SaaS类项目里带团队做自动化测试近…...

JMeter断言实战:从误配到分层校验的避坑指南

1. 为什么断言不是“加个检查框”就完事了?很多人第一次在 JMeter 里点开“添加 → 断言 → 响应断言”,填上“包含文本:success”,跑完看绿色小勾就以为接口测试闭环了。我带过三届测试团队,新同事交来的脚本里&#…...

JMeter接口断言实战:从响应匹配到业务逻辑校验

1. 断言不是“加个勾就完事”的装饰品,而是接口测试的判决书很多人第一次在JMeter里点开“添加 → 断言 → 响应断言”,填上一个“包含文本:success”,跑完看绿色小对勾亮了,就以为测试通过了——结果上线后接口明明返…...

WebSocket压测实战:从协议原理到高并发稳定性验证

1. 为什么WebSocket压测不能照搬HTTP那一套?很多人第一次想对WebSocket服务做压力测试时,下意识打开JMeter,新建一个HTTP请求,把ws://地址往URL栏一填,点运行——然后就卡在“连接超时”或者“400 Bad Request”上&…...

Open MCT性能测试实战:JMeter多协议分层压测方法

1. 为什么Open MCT的性能不能只靠“感觉”来判断?Open MCT——NASA开源的航天器监控与控制系统可视化平台,这几年在工业物联网、能源调度、科研实验数据看板等场景里越来越常见。但凡接触过它的人,几乎都会在部署后遇到同一个问题&#xff1a…...

创业团队如何利用Taotoken统一管理多个AI模型API以控制开发成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 创业团队如何利用Taotoken统一管理多个AI模型API以控制开发成本 对于资源有限的创业团队而言,在业务开发中引入大模型能…...

Open MCT性能压测实战:JMeter定制化四阶测试方法论

1. 为什么Open MCT的性能不能只靠“感觉”来判断?Open MCT——NASA开源的航天器监控与控制平台,这几年在工业SCADA、能源调度、实验室数据可视化等场景里越来越常见。但凡用过它的团队,几乎都经历过这样一个阶段:开发阶段一切丝滑…...

JMeter接口测试实战:从登录闭环到分布式压测

1. 为什么接口测试不能只靠“点点点”——从一个被忽略的500错误说起我第一次在客户现场接手一个电商后台系统时,开发说“所有接口都测过了,Postman跑了一遍,没问题”。上线前夜,支付回调接口突然返回500,日志里只有一…...