拦截器的概念拦截器顾名思义就是在请求到达目标接口之前 “拦一下”做完我们指定的操作后再决定是放它继续走还是直接把它拦下。举个生活中的例子我们去银行办理业务进门后不会直接找柜员而是要先取号、安检 —— 这两步就相当于 “拦截器”。如果带了身份证、取号成功就放行去窗口办业务对应接口正常执行如果没带身份证取号失败就直接被拦下没法办业务对应请求被拒绝等业务办完后还能给柜员评价这就是请求执行完后的拦截操作。放到 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(false); // 校验Session中是否有用户信息 if (session null || session.getAttribute(loginUser) null) { log.warn(用户未登录); // 设置响应编码避免中文乱码 response.setContentType(text/html;charsetutf-8); // 设置响应状态码401未认证 response.setStatus(401); // 给前端返回提示信息 response.getOutputStream().write(用户未登录请先登录.getBytes(UTF-8)); return false; // 拦截请求 } // 有用户信息放行 log.info(用户已登录放行请求); return true; } }2.注册配置拦截器告诉 Spring 要拦截哪些请求当我们定义好拦截器之后Spring 还不知道要把它用在哪些请求上需要新建一个配置类告诉 Spring哪些请求要拦截哪些请求不需要拦截比如登录接口本身肯定不能拦截。这个配置类需要实现WebMvcConfigurer接口并重写重写addInterceptors方法完成注册Configuration public class WebConfig implements WebMvcConfigurer { Autowired private LoginInterceptor loginInterceptor; Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor) .addPathPatterns(/book/**); //这表示拦截/book目录之下的任意级路径 }上图是关于路径配置的一些讲解。总结拦截器是 SpringBoot 中处理通用请求逻辑的神器核心就是 “统一拦截、按需处理”。本文针对拦截器主要讲了以下三点拦截器的作用在请求到达接口前后执行通用逻辑减少冗余代码核心方法preHandle请求前最常用返回 true 放行、false 拦截使用步骤定义拦截器实现接口 写逻辑注册拦截器配置拦截 / 排除路径