SpringBoot 拦截器

拦截器的概念

拦截器,顾名思义,就是在请求到达目标接口之前 “拦一下”,做完我们指定的操作后,再决定是放它继续走,还是直接把它拦下。

举个生活中的例子:我们去银行办理业务,进门后不会直接找柜员,而是要先取号、安检 —— 这两步就相当于 “拦截器”。

  • 如果带了身份证、取号成功,就放行,去窗口办业务(对应接口正常执行);
  • 如果没带身份证,取号失败,就直接被拦下,没法办业务(对应请求被拒绝);
  • 等业务办完后,还能给柜员评价,这就是请求执行完后的拦截操作。

放到 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;charset=utf-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 中处理通用请求逻辑的神器,核心就是 “统一拦截、按需处理”。本文针对拦截器主要讲了以下三点:

  1. 拦截器的作用:在请求到达接口前后执行通用逻辑,减少冗余代码
  2. 核心方法:preHandle(请求前,最常用)返回 true 放行、false 拦截
  3. 使用步骤:定义拦截器(实现接口 + 写逻辑)+注册拦截器(配置拦截 / 排除路径)

Read more

OpenClaw Ubuntu 24.04.4 安装指南

OpenClaw部署(Ubuntu 24.04.4 ) 概述 系统要求 * Node.js 22+:安装脚本可自动检测并安装(下文补充手动安装方案); * Ubuntu 24.04.4(本文重点),也支持 macOS/Windows(Windows 推荐 WSL2); * pnpm:仅从源码构建时需要。 安装方法 方法一:推荐安装脚本(一键式) 脚本自动完成 Node.js 检测/安装、CLI 全局安装、启动引导向导,是最省心的方式。 标准安装(含引导) curl -fsSL https://openclaw.ai/install.sh | bash 如下图所示: 安装完后进入设置页面如下图所示:

By Ne0inhk

手把手教你部署Komari监控:轻量级服务器探针搭建全记录

前言 最近在整理手头的几台服务器,一直想找个趁手的监控工具。以前用过Zabbix,功能确实强,但配置起来总觉得有点重;哪吒监控也不错,不过有时候就想换个轻量点的试试。前两天逛GitHub的时候发现了Komari这个项目,一眼就被它的简洁风格吸引了。 Komari是一个用Go语言写的自托管监控工具,最大的特点就是轻量——官方说二进制文件本身只有十几兆,跑起来内存占用也很低。它的界面长得有点像现在流行的“探针”风格,可以直观地看到CPU、内存、磁盘、网络流量这些基础指标,还支持多台服务器统一管理。 我觉得它比较适合两类人:一是想自己掌控数据、不想用第三方监控服务的个人开发者,二是需要快速部署、不喜欢折腾复杂配置的小团队。数据都存在自己的服务器里,没有隐私方面的顾虑。 这篇教程没有任何“高大上”的理论,就是把我自己从零开始部署的步骤一步一步记下来。哪怕你之前没怎么用过Linux,只要会敲命令、能连上服务器,跟着做应该也能跑起来。我会尽量把每步在做什么说清楚,而不是简单地让你“复制粘贴”。 一、准备工作 在正式开始之前,需要先确认几样东西准备好了。 1. 准备一台具备公网IP的

By Ne0inhk
【Linux】Linux 系统的目录结构详解

【Linux】Linux 系统的目录结构详解

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Linux这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * 【Linux】Linux 系统的目录结构详解 📁 * 1. Linux 目录结构概述 🌐 * 2. 根目录 (/) —— 系统的起点 🚩 * 3. /bin —— 基本命令的家 🛠️ * 4. /sbin —— 系统管理员的工具箱 🛠️ * 5. /lib 和 /lib64 —— 系统库的家园 📦 * 6. /etc —— 系统配置的中枢 📝 * 7. /home —— 用户的私人天地 🏠 * 8. /usr —— 用户程序的宝库 📚 * 9. /var —— 变化的数据中心 🔄 * 10. /dev —— 设备的入口 🖥️ * 11. /proc —— 进程的虚拟文件系统

By Ne0inhk
Ubuntu 环境安装 之 RabbitMQ 快速入手

Ubuntu 环境安装 之 RabbitMQ 快速入手

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:RabbitMQ 📚本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。 Ubuntu 环境安装 * 前言 * 一、什么是MQ(消息队列) * MQ多用于分布式系统之间进行通信 * 二、MQ的作用 * 1、异步解耦 * 2、流量削峰 * 3、消息分发 * 4、延迟通知 * 三、为什么选择 RabbitMQ * 1、Kafka * 2、RocketMQ * 3、RabbitMQ * 四、RabbitMQ 快速上手 * 1、Ubuntu 环境安装 * 2、安装Erlang * 3、

By Ne0inhk