news 2026/6/12 0:26:59

【Spring】HandlerInterceptor解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Spring】HandlerInterceptor解析

HandlerInterceptor 深度解析

一、核心方法

HandlerInterceptor接口定义了三个核心方法,构成完整的请求生命周期拦截机制:

publicinterfaceHandlerInterceptor{// 1. 请求预处理(Controller执行前)defaultbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{returntrue;// 返回true继续流程,false中断请求}// 2. 请求后处理(Controller执行后,视图渲染前)defaultvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{}// 3. 请求完成回调(视图渲染后)defaultvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{}}

执行顺序:多个拦截器时,preHandle()按配置顺序正序执行,而postHandle()afterCompletion()按逆序执行。


二、主要作用

HandlerInterceptor的核心作用可归纳为:

1.请求预处理

在Controller方法执行前进行通用操作,如权限验证、日志记录、参数修改等。通过返回布尔值决定是否继续执行后续流程。

2.请求后处理

在Controller执行后、视图渲染前对ModelAndView对象进行操作,可修改模型数据或视图属性。

3.资源清理

在整个请求完成后(包括视图渲染)执行资源释放操作,如关闭文件流、释放数据库连接,防止资源泄漏。


三、应用场景

高频场景

场景实现方式典型方法
登录鉴权检查Session/JWT令牌preHandle()
接口限流基于Redis计数器preHandle()
日志追踪生成TraceId并写入MDCpreHandle()+afterCompletion()
参数加解密对敏感参数统一处理preHandle()
性能监控记录请求耗时preHandle()+afterCompletion()
多租户隔离解析租户ID并设置上下文preHandle()

特殊场景

  • 跨域处理:动态添加CORS响应头
  • 请求头统一处理:解析AuthorizationX-Request-ID等元数据
  • 异常信息记录:在afterCompletion()中捕获并记录控制器抛出的异常

四、注意事项与最佳实践

⚠️ 关键注意事项

  1. 执行顺序控制

    • 拦截器执行顺序由注册顺序决定,可使用@Order注解调整优先级(值越小越先执行)
    • 外层拦截器的preHandle()返回false会阻止内层拦截器执行
  2. 与Filter的区别

    • HandlerInterceptor:运行于Spring MVC框架内,可访问Spring上下文,精准拦截Controller
    • Filter:基于Servlet规范,更底层,可拦截所有请求(包括静态资源)
  3. 与AOP的选型

    • HandlerInterceptor:适用于Web层全局请求处理
    • AOP:适用于业务方法级别的横切关注点(如事务、缓存)

✅ 最佳实践

  1. 保持可测试性:将核心业务逻辑抽出到独立的Service或工具类,避免拦截器成为"不可测试的黑盒"

    // 推荐做法if(!authService.checkPermission(user,request.getRequestURI())){log.warn("无权限访问: {}",request.getRequestURI());response.sendRedirect("/403");returnfalse;}
  2. 避免臃肿逻辑:不要在拦截器中编写大量业务判断代码

  3. 增强可观测性:为拦截器添加日志和Trace ID,便于分布式链路追踪和问题排查

  4. 异常处理结合:配合@ControllerAdvice实现全局异常捕获与处理

  5. 资源及时释放:必须在afterCompletion()中释放线程本地变量(ThreadLocal),防止内存泄漏


五、典型配置示例

@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(newAuthInterceptor()).addPathPatterns("/api/ **")// 拦截路径.excludePathPatterns("/api/login","/api/public/ **");// 排除路径}}

通过合理运用HandlerInterceptor,可构建健壮的"请求防火墙",提升系统的安全性、可维护性与可扩展性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 22:01:39

Nature 正刊:科学家揭示视触觉“感同身受”的神经科学基础

当你看到别人被触碰时,你的大脑正悄悄激活自己的触觉区域,让你也能“感同身受”。你有没有想过,为什么看到别人被轻轻触摸时,自己好像也能感受到那种触感?为什么观看他人经历痛苦时,我们会不自觉地皱眉&…

作者头像 李华
网站建设 2026/6/10 1:45:24

GPT-SoVITS项目GitHub星标破万背后的秘密

GPT-SoVITS:为何一个语音克隆项目能在GitHub上引爆万星? 在AI生成内容(AIGC)浪潮席卷全球的今天,图像、文本、视频的“一键生成”已不再稀奇。但真正让开发者和创作者眼前一亮的,往往是那些把高门槛技术变得…

作者头像 李华
网站建设 2026/6/9 23:31:38

沉思Open-AutoGLM:它如何重塑AI工程化落地的未来?

第一章:沉思Open-AutoGLM:它如何重塑AI工程化落地的未来? 在人工智能迅猛发展的当下,大模型从实验室走向实际生产环境的过程仍面临诸多挑战。Open-AutoGLM 的出现,正是为了解决 AI 工程化落地中的关键瓶颈——将自然语…

作者头像 李华
网站建设 2026/6/10 1:51:48

定制化文本内容审核:Amazon Nova在SageMaker上的实战指南

定制化文本内容审核与Amazon Nova 考虑一个快速增长的社交媒体平台,每日处理数百万条用户帖子。其内容审核团队面临一个常见挑战:基于规则的系统将讨论“刀工技巧”的烹饪视频标记为暴力内容,令用户沮丧,同时却漏掉了伪装成餐厅评…

作者头像 李华
网站建设 2026/6/5 22:59:16

【智谱开源Open-AutoGLM部署全攻略】:手把手教你本地高效部署AI模型

第一章:智谱开源Open-AutoGLM模型本地部署概述Open-AutoGLM 是由智谱AI推出的开源自动化图学习模型,旨在简化图神经网络在实际场景中的应用流程。该模型支持自动特征提取、图结构构建与任务驱动的模型优化,适用于金融风控、知识图谱补全和社交…

作者头像 李华
网站建设 2026/6/10 18:25:51

星露谷农场规划器终极教程:从零开始设计梦幻布局

星露谷农场规划器终极教程:从零开始设计梦幻布局 【免费下载链接】stardewplanner Stardew Valley farm planner 项目地址: https://gitcode.com/gh_mirrors/st/stardewplanner 想要在《星露谷物语》中打造既高效又美观的完美农场吗?本完整指南将…

作者头像 李华