拦截器的概念
拦截器,顾名思义,就是在请求到达目标接口之前'拦一下',做完我们指定的操作后,再决定是放它继续走,还是直接把它拦下。
举个生活中的例子:我们去银行办理业务,进门后不会直接找柜员,而是要先取号、安检——这两步就相当于'拦截器'。
- 如果带了身份证、取号成功,就放行,去窗口办业务(对应接口正常执行);
- 如果没带身份证,取号失败,就直接被拦下,没法办业务(对应请求被拒绝);
- 等业务办完后,还能给柜员评价,这就是请求执行完后的拦截操作。
放到 SpringBoot 项目里,拦截器就是在请求到达 Controller 接口前后,执行我们预先写好的代码,比如登录校验、日志记录、参数校验这些通用操作,不用在每个接口里重复写,大大减少冗余代码。
拦截器的核心执行时机:三个关键方法
拦截器的核心是实现 Spring 的 HandlerInterceptor 接口,里面有三个核心方法,对应请求的不同阶段。
1. preHandle:请求到达接口前执行(最常用)
这是拦截器最核心的方法,请求发过来后,第一个执行的就是它。
- 这个方法返回 true:表示放行,请求继续走,直到到达 Controller 接口;
- 这个方法返回 false:表示拦截,请求直接被打回,后续的接口、其他拦截方法都不会执行。
我们平时做的登录校验,主要就是在这个方法里写。
2. postHandle:接口执行完后执行
当 preHandle 放行,且 Controller 接口的代码执行完毕后,会执行这个方法。
3. afterCompletion:整个请求结束后执行
这是拦截器的最后一个方法,当接口执行完、响应数据已经返回给前端后执行,一般用来做资源清理,比如关闭流、释放连接。
简单总结执行顺序:preHandle(请求前) → 执行 Controller 接口 → postHandle(接口后) → 返回响应 → afterCompletion(请求结束)。
用在登录校验的拦截器
1. 定义拦截器,写好校验逻辑
我们首先需要新建一个拦截器类,实现 HandlerInterceptor 接口,重写 preHandle 方法做登录校验,其他方法按需重写即可。核心逻辑:从 Session 中获取用户信息,有就放行,没有就拦截并返回'未登录'。
@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
// 核心:请求到达接口前做登录校验
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("preHandle 目标方法执行之前");
// 获取 Session,参数为 false 表示:如果没有 Session,就不新建新的 Session 对象
HttpSession session = request.getSession();
(session == || session.getAttribute() == ) {
log.warn();
response.setContentType();
response.setStatus();
response.getOutputStream().write(.getBytes());
;
}
log.info();
;
}
}

