news 2026/4/13 5:15:15

【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/4/12 6:56:44

Stable Diffusion WebUI Docker:轻松部署AI绘画环境的终极指南

Stable Diffusion WebUI Docker:轻松部署AI绘画环境的终极指南 【免费下载链接】stable-diffusion-webui-docker Easy Docker setup for Stable Diffusion with user-friendly UI 项目地址: https://gitcode.com/gh_mirrors/st/stable-diffusion-webui-docker …

作者头像 李华
网站建设 2026/4/11 17:09:04

D2R自动化神器Botty:解放双手的智能游戏助手

还在为暗黑破坏神2重制版中重复的刷怪、捡装备操作而烦恼吗?Botty这款开源自动化工具将成为你在D2R世界中的得力助手,通过模拟键盘鼠标操作,自动完成各种重复任务,让你真正享受游戏的乐趣。 【免费下载链接】botty D2R Pixel Bot …

作者头像 李华
网站建设 2026/4/10 7:47:02

游戏开发革命:HotPatcher热更新引擎如何重塑资源管理流程

游戏开发革命:HotPatcher热更新引擎如何重塑资源管理流程 【免费下载链接】HotPatcher Unreal Engine hot update manage and package plugin. 项目地址: https://gitcode.com/gh_mirrors/ho/HotPatcher 在游戏开发领域,版本迭代和资源更新一直是…

作者头像 李华
网站建设 2026/4/12 13:44:38

M1芯片Android模拟器完全配置手册:从零开始搭建开发环境

M1芯片Android模拟器完全配置手册:从零开始搭建开发环境 【免费下载链接】android-emulator-m1-preview 项目地址: https://gitcode.com/gh_mirrors/an/android-emulator-m1-preview 在Apple Silicon M1芯片的Mac设备上进行Android应用开发,选择…

作者头像 李华
网站建设 2026/4/4 18:56:48

仅限内部流出:Open-AutoGLM沙箱环境支付拦截机制解密与绕行策略

第一章:Open-AutoGLM 点咖啡不自动付款 在使用 Open-AutoGLM 框架实现自动化点单功能时,部分用户反馈系统能够成功识别菜单并提交订单,但未触发自动付款流程。该问题通常出现在支付网关鉴权失败或用户账户余额校验逻辑异常的场景中。 问题排…

作者头像 李华
网站建设 2026/3/26 22:52:28

GPT-SoVITS语音合成在心理疗愈语音内容生成中的尝试

GPT-SoVITS语音合成在心理疗愈语音内容生成中的尝试 在心理咨询室的灯光下,一位来访者闭上眼睛,耳机里传来熟悉而温和的声音:“深呼吸……感受空气缓缓流入身体。”这声音不属于任何远程连线的真人咨询师,而是由AI生成的、高度还原…

作者头像 李华