SpringMVC_拦截器机制笔记

SpringMVC_拦截器机制笔记
LiuxzSpringMVC_拦截器可在请求到达目标方法前后执行额外操作,是实现权限验证、日志记录等通用功能的核心机制,以下从核心概念、使用步骤、执行规则三方面整理:
一、核心概念与作用
1. 拦截器定义
拦截器是实现 HandlerInterceptor 接口的组件,能在 请求处理的关键节点 插入自定义逻辑,不破坏原有业务代码,实现 “横切关注点” 的复用。
2. 典型应用场景
- 权限验证:判断用户是否登录、是否有权限访问接口(如未登录则拦截请求)。
- 日志记录:记录请求的 URL、参数、处理时长等信息(用于调试或审计)。
- 数据共享:在请求处理前向
request域中存入公共数据(如登录用户信息,供页面使用)。 - 资源统一处理:如统一编码设置、跨域配置补充等。
二、拦截器使用步骤
需两步完成拦截器的创建与配置,确保拦截器生效。
步骤 1:创建拦截器(实现 HandlerInterceptor 接口)
HandlerInterceptor 接口提供 3 个核心方法,分别对应请求处理的不同阶段,可按需重写(无需全部实现)。
| 方法名 | 执行时机 | 返回值含义 | 核心作用 |
|---|---|---|---|
preHandle |
请求到达目标方法 之前 | true 放行,false 拦截 |
权限验证、参数预处理 |
postHandle |
目标方法执行 之后,页面渲染前 | 无返回值 | 修改响应数据、补充域属性 |
afterCompletion |
页面渲染 之后(请求完成后) | 无返回值 | 资源清理(如关闭流、释放连接) |
示例代码:
1 | // 自定义日志拦截器 |
步骤 2:配置拦截器(实现 WebMvcConfigurer)
创建配置类,通过 addInterceptors 方法指定 “拦截器” 与 “拦截路径”,决定拦截器作用于哪些请求。
示例代码:
1 |
|
配置说明:
addPathPatterns:指定拦截的 URL 规则,支持通配符(如/api/**表示/api下所有请求)。excludePathPatterns:指定不拦截的 URL(如登录、注册接口,静态资源等),优先级高于拦截规则。
三、拦截器执行规则(核心)
拦截器的执行顺序(单个 / 多个)、异常影响是关键,需重点理解。
1. 单个拦截器的执行流程
请求从发起至结束,拦截器与目标方法的执行顺序固定:
1 | 请求发起 → preHandle(放行) → 目标方法执行 → postHandle → 页面渲染 → afterCompletion → 请求结束 |
2. 多个拦截器的执行顺序
当配置多个拦截器时,执行顺序遵循 “preHandle 正序,postHandle/afterCompletion 倒序”,顺序由配置时 addInterceptor 的先后决定。
示例:配置拦截器 A、B(A 先注册,B 后注册),执行流程如下:
1 | 请求发起 → A.preHandle(放行) → B.preHandle(放行) → 目标方法 → B.postHandle → A.postHandle → 页面渲染 → B.afterCompletion → A.afterCompletion → 请求结束 |
3. 异常与执行的关系
规则 1:仅
preHandle执行成功(返回true)的拦截器,才会执行对应的afterCompletion。例:A.preHandle(true)→ B.preHandle(false)→ 仅执行 A.afterCompletion,B 的 postHandle 和 afterCompletion 都不执行。
规则 2:
postHandle执行失败(抛异常),不影响afterCompletion执行。例:B.postHandle 抛异常 → 跳过 A.postHandle,但仍会执行 B.afterCompletion → A.afterCompletion。
规则 3:
postHandle/afterCompletion从异常发生处开始,倒序链路终止于异常处。例:B.postHandle 抛异常 → 仅执行 B.afterCompletion,不再执行 A.postHandle 和 A.afterCompletion。
![][D:\Obsidian\note\SSM\img\2025-10-27_00-51-16-0.png]



