SpringMVC_拦截器机制笔记

SpringMVC_拦截器可在请求到达目标方法前后执行额外操作,是实现权限验证、日志记录等通用功能的核心机制,以下从核心概念、使用步骤、执行规则三方面整理:

一、核心概念与作用

1. 拦截器定义

拦截器是实现 HandlerInterceptor 接口的组件,能在 请求处理的关键节点 插入自定义逻辑,不破坏原有业务代码,实现 “横切关注点” 的复用。

2. 典型应用场景

  • 权限验证:判断用户是否登录、是否有权限访问接口(如未登录则拦截请求)。
  • 日志记录:记录请求的 URL、参数、处理时长等信息(用于调试或审计)。
  • 数据共享:在请求处理前向 request 域中存入公共数据(如登录用户信息,供页面使用)。
  • 资源统一处理:如统一编码设置、跨域配置补充等。

二、拦截器使用步骤

需两步完成拦截器的创建与配置,确保拦截器生效。

步骤 1:创建拦截器(实现 HandlerInterceptor 接口)

HandlerInterceptor 接口提供 3 个核心方法,分别对应请求处理的不同阶段,可按需重写(无需全部实现)。

方法名 执行时机 返回值含义 核心作用
preHandle 请求到达目标方法 之前 true 放行,false 拦截 权限验证、参数预处理
postHandle 目标方法执行 之后,页面渲染前 无返回值 修改响应数据、补充域属性
afterCompletion 页面渲染 之后(请求完成后) 无返回值 资源清理(如关闭流、释放连接)

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 自定义日志拦截器
@Component
public class LogInterceptor implements HandlerInterceptor {
// 请求处理前执行(权限验证常用)
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle:记录请求URL=" + request.getRequestURI());
return true; // 放行请求,进入目标方法
}

// 目标方法执行后,页面渲染前
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle:目标方法执行完成");
}

// 整个请求完成后(页面渲染后)
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion:请求处理完毕,清理资源");
}
}

步骤 2:配置拦截器(实现 WebMvcConfigurer)

创建配置类,通过 addInterceptors 方法指定 “拦截器” 与 “拦截路径”,决定拦截器作用于哪些请求。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class MvcConfig implements WebMvcConfigurer {
// 注入自定义拦截器(需先将拦截器注册为Bean,如加@Component)
@Autowired
private LogInterceptor logInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(logInterceptor) // 注册拦截器
.addPathPatterns("/api/**") // 拦截的路径(/** 表示所有请求)
.excludePathPatterns("/api/login"); // 排除的路径(登录接口不拦截)
}
}

配置说明:

  • 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 都不执行。

  • 规则 2postHandle 执行失败(抛异常),不影响 afterCompletion 执行。

    例:B.postHandle 抛异常 → 跳过 A.postHandle,但仍会执行 B.afterCompletion → A.afterCompletion。

  • 规则 3postHandle/afterCompletion 从异常发生处开始,倒序链路终止于异常处。

    例:B.postHandle 抛异常 → 仅执行 B.afterCompletion,不再执行 A.postHandle 和 A.afterCompletion。

![][D:\Obsidian\note\SSM\img\2025-10-27_00-51-16-0.png]