当前位置: 首页 > news >正文

Springboot登录验证的统一拦截处理

在进行Springboot项目开发的时候如何把每次请求都要验证的用户进行提取拦截统一处理

背景

如果不进行统一的拦截处理,其实这是一个非常痛苦的一件事情,因为每次用户请求你都要去进行用户的信息(用户信息存储在session中)的验证,代码重复,所以在本篇提供一个解决方案:

定义一个拦截器,把请求都进行统一的处理,如果Session中存在用户的信息那么就放行;如果不存在,那么就直接出现异常报错未登录。在这样的一个方案中其实还存在着一个问题,在业务逻辑中我要去获取用户的信息,那不又是很麻烦了?这里可以通过ThreadLocal解决。

为什么用ThreadLocal:当用户发起请求时,会访问我们像tomcat注册的端口,任何程序想要运行,都需要有一个线程对当前端口号进行监听,tomcat也不例外,当监听线程知道用户想要和tomcat连接连接时,那会由监听线程创建socket连接,socket都是成对出现的,用户通过socket像互相传递数据,当tomcat端的socket接受到数据后,此时监听线程会从tomcat的线程池中取出一个线程执行用户请求,在我们的服务部署到tomcat后,线程会找到用户想要访问的工程,然后用这个线程转发到工程中的controller,service,dao中,并且访问对应的DB,在用户执行完请求后,再统一返回,再找到tomcat端的socket,再将数据写回到用户端的socket,完成请求和响应通过以上讲解,我们可以得知 每个用户其实对应都是去找tomcat线程池中的一个线程来完成工作的, 使用完成后再进行回收,既然每个请求都是独立的,所以在每个用户去访问我们的工程时,我们可以使用threadlocal来做到线程隔离,每个线程操作自己的一份数据

定义一个ThreadLocal线程工具类

便于对线程内部的值进行处理。

public class UserHolder {public static final ThreadLocal<User> userThreadLocal = new ThreadLocal<>();public static void setValue(User user){userThreadLocal.set(user);}public static User getValue(){return userThreadLocal.get();}public static  void clear(){userThreadLocal.remove();}
}

定义拦截器

public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {// 获取 sessionHttpSession session = request.getSession();// 检查用户是否已登录if (session.getAttribute("user") == null) {// 用户未登录,进行相关处理throw new BusinessException(ErrorCode.NOT_LOGIN_ERROR);}// 从 session 中获取用户数据User user = (User) session.getAttribute("user");// 将用户数据存储到 ThreadLocal 中,以便在整个请求周期内访问UserHolder.setValue(user);// 进行其他逻辑验证,根据需求自行添加return true; // 允许请求继续执行}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {// 在请求处理之后执行,可以对 ModelAndView 进行修改}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {// 在请求完成之后执行,用于资源清理等操作// 清理 ThreadLocal 中的用户数据,防止内存泄漏UserHolder.clear();}
}

让拦截器生效

通过配置让拦截器生效

@Configuration
public class MvcConfig implements WebMvcConfigurer {public void addInterceptors(InterceptorRegistry registry) {// 添加拦截器// excludePath 就是排除在外被拦截的路径registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**")  .excludePathPatterns("/user/login");}
}

然后就可以啦

测试

测试Controller

@RestController
@RequestMapping("/user")
public class UserController {@Resourceprivate UserService userService;@PostMapping("/login")public BaseResponse<User> login(HttpSession session){System.out.println("Hello");Random random = new Random(new Date().getTime()) ;User user = new User(random.nextLong(), "123","123454","123");session.setAttribute("user",user);return ResultUtils.success(user);}@GetMapping("/get")public BaseResponse<User> get(){return ResultUtils.success(UserHolder.getValue());}
}

测试结果

开始没有登录

在这里插入图片描述

进行登录

在这里插入图片描述

再次获取get请求就可以了

在这里插入图片描述

这里我出现一个问题我一直调试了很久,md,就是在配置拦截器的时候添加路径首先把所有路径进行拦截,然后放行/user/login就好,我的这个项目在配置文件中给所有的路径首先加了一个/api这样的前缀,然后我在拦截路径的时候都加了api,这个其实是不用加的,直接上路径就好了,spring自动会加。

相关文章:

Springboot登录验证的统一拦截处理

在进行Springboot项目开发的时候如何把每次请求都要验证的用户进行提取拦截统一处理 背景 如果不进行统一的拦截处理&#xff0c;其实这是一个非常痛苦的一件事情&#xff0c;因为每次用户请求你都要去进行用户的信息&#xff08;用户信息存储在session中&#xff09;的验证&…...

自定义类型详解(上)

结构体 1 结构体的声明 1.1 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag//struct是结构体的标志&#xff0c;tag是标签;名字。 {member-list;//成员变量 }variable-list;//变量列…...

【数据库——MySQL】(9)函数、查询练习及讲解

目录 1. 题目1.1 函数练习1.2 数据库查询 2. 解答2.1 函数练习2.2 数据库查询 1. 题目 1.1 函数练习 求圆周率的值&#xff0c;保留 6 位小数。生成两个 100 到 200 间的随机数。将”武汉大学”,”数学学院”,”计算数学”连接成一个字符串。求字符串中第三个字符为 A 的所有…...

【数据结构与算法——C语言】“串操作与算法”之“找出最长串及其长度”

目录 1. 实验内容及上机实验所用平台1.1 实验内容1.2 实验平台软件 2. 流程图3. 源代码4. 用例测试5. 实验总结 1. 实验内容及上机实验所用平台 1.1 实验内容 【问题描述】 给定两个字符串 s1 和 s2&#xff0c;求最长的 s1 前缀 ss 使得 ss 为 s2 的最长后缀&#xff0c;输出…...

泡泡玛特:一家中国潮玩品牌的出海之旅

泡泡玛特的出海之旅&#xff0c;可以为中国出海企业提供怎样的启示和借鉴&#xff1f; 中国潮玩品牌的出海之旅 如果在年轻人群体中聊起泡泡玛特&#xff0c;那么估计无人不知无人不晓。这家成立于2010年的潮玩企业&#xff0c;凭借琳琅满目让消费者爱不释手的创新产品&#xf…...

淘宝商品sku信息抓取接口api

在电商行业中&#xff0c;SKU是一个经常被使用的术语&#xff0c;但是对于很多人来说&#xff0c;这个词可能还比较陌生。在这篇文章中&#xff0c;我们将详细解释什么是SKU&#xff0c;以及在电商业务中它的作用和意义。 什么是SKU&#xff1f; SKU是“Stock Keeping Unit”…...

MySQL 多表关系(多表查询 一)

多表关系描述 MySQL是一种关系型数据库管理系统&#xff0c;它支持多表关系&#xff0c;这在数据库设计和查询中非常重要。 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务…...

【面试高高手】——JavaIO篇(23题)

文章目录 1.什么是Java IO&#xff1f;2.如何从数据传输方式理解IO流&#xff1f;3.Java IO设计上使用了什么设计模式&#xff1f;4.什么是Java NIO&#xff1f;5.什么时BIO?6.什么是AIO?7.你怎么理解同步IO和异步IO?8.你怎么理解阻塞IO和非阻塞IO?9.IO中的输入流和输出流有…...

图像采集 deep OCR

按照芯片类型可以分为CCD相机、CMOS相机 按照传感器的结构特性可以分为线阵相机、面阵相机 按照扫描方式可以分为隔行扫描相机、逐行扫描相机 按照分辨率大小可以分为普通分辨率相机、高分辨率相机按照输出信号方式可以分为模拟相机、数字相机 按照输出色彩可以分为单色(黑白)相…...

Linux 终端命令总结

一、常用的七条命令 命令 对应英文作用lslist查看当前文件夹下的内容pwdprint work directory查看当前所在文件夹cd [目录名]change directory切换文件夹 touch [文件名]touch如果文件不存在新建文件mkdir [目录名]make directory创建目录rm[文件名]remo…...

中国核动力研究设计院使用 DolphinDB 替换 MySQL 实时监控仪表

随着仪表测点的大幅增多和采样频率的增加&#xff0c;中国核动力研究设计院仪控团队原本基于 MySQL 搭建的旧系统已经无法满足大量数据并发写入、实时查询和聚合计算的需求。他们在研究 DB-Engines 时序数据库榜单时了解到国内排名第一的 DolphinDB。经过测试&#xff0c;发现其…...

速看!软考中项100条重要知识点集锦!

1. 项目的特点有哪些&#xff1f; 2. 项目的组织方式有哪些&#xff1f;分别具有什么优缺点&#xff1f; 3. 项目管理过程组有哪些&#xff1f; 4. 怎么样才能成为一位优秀的项目经理&#xff1f; 5. PMO的主要职能有哪些&#xff1f; 6. 项目经理&#xff08;PM&#xff…...

Pycharm在进行debug时出现collecting data如何解决?

Pycharm在进行debug时变量界面出现collecting data&#xff0c;问题如下&#xff1a; 解决方法&#xff1a;打开Setting界面&#xff0c;在Python Debugger选项中勾选下图中的Gevent compatible即可。...

【算法分析与设计】算法概述

目录 一、学习要点二、算法的定义三、算法的性质四、程序(Program)五、问题求解(Problem Solving)六、算法的描述七、算法分析的目的八、算法复杂性分析&#xff08;一&#xff09;算法时间复杂性分析&#xff08;二&#xff09;算法渐近复杂性1、渐进上界记号-大O符号2、渐进下…...

如何进一步全面提高项目估算精准度?

项目估算非常重要&#xff0c;这直接关系着项目的成本和收入&#xff0c;如果估算不准确&#xff0c;将为项目带来较大风险。一般软件规模可以用多种方式进行估算&#xff0c;但是用功能点估算方式更准确&#xff0c;而自动估算让估算更快速&#xff0c;我们以CoCode开发的估算…...

Git学习笔记4

GitHub是目前最火的开源项目代码托管平台。它是基于web的Git仓库&#xff0c;提供公有仓库和私有仓库&#xff0c;但私有仓库是需要付费的。 到Github上找类似的项目软件。 GitLab可以创建免费的私有仓库。 GitLab是利用 Ruby开发的一个开源的版本管理系统&#xff0c;实现一个…...

【红外与可见光图像融合】离散平稳小波变换域中基于离散余弦变换和局部空间频率的红外与视觉图像融合方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

成都睿趣科技:抖音开通橱窗带货需要钱吗

随着社交媒体和电子商务的蓬勃发展&#xff0c;抖音作为一种流行的短视频平台&#xff0c;也推出了自己的“抖音橱窗”功能&#xff0c;让内容创作者能够通过视频展示和销售产品&#xff0c;从而实现商业化。那么&#xff0c;抖音橱窗带货是否需要费用呢? 首先&#xff0c;要开…...

中间件 - 分布式协调服务Zookeeper

目录 一. 前言 二. 树状结构 2.1. ZNode 2.1.1. stat 2.1.2. ACL 三. NameService命名服务 四. Configuration 配置管理 五. GroupMembers 集群管理 六. 集群三个角色及状态 七. 选举算法 八. Watcher 九. 设计目的 十. 典型使用场景 一. 前言 Zookeeper是一个分布…...

golang的实用工具

golang的实用工具 Go 语言提供了许多实用的工具&#xff0c;以下是其中一些常用的工具&#xff1a; 1. go run&#xff1a;用于直接运行 Go 源代码文件&#xff0c;无需显式编译。 2. go build&#xff1a;用于将 Go 代码编译成可执行文件或库。 3. go test&#xff1a;用于…...

ARM PMU性能监控单元原理与编程实践

1. ARM PMU性能监控基础架构解析 性能监控单元(Performance Monitoring Unit, PMU)是现代处理器微架构中的关键组件&#xff0c;它通过硬件计数器实现对处理器运行时行为的精确测量。在ARMv8/v9架构中&#xff0c;PMU的设计遵循了高度模块化和可扩展的原则&#xff0c;能够支持…...

Node.js服务端应用无缝集成Taotoken提供多模型AI能力

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Node.js服务端应用无缝集成Taotoken提供多模型AI能力 将大模型能力集成到Node.js后端服务中&#xff0c;可以快速为应用增加智能对…...

Uncle小说阅读器:桌面级智能小说聚合与个性化阅读方案

Uncle小说阅读器&#xff1a;桌面级智能小说聚合与个性化阅读方案 【免费下载链接】uncle-novel &#x1f4d6; Uncle小说&#xff0c;PC版&#xff0c;一个全网小说下载器及阅读器&#xff0c;目录解析与书源结合&#xff0c;支持有声小说与文本小说&#xff0c;可下载mobi、e…...

原神玩家信息查询完整指南:如何快速掌握账号详情

原神玩家信息查询完整指南&#xff1a;如何快速掌握账号详情 【免费下载链接】GenshinPlayerQuery 根据原神uid查询玩家信息(基础数据、角色&装备、深境螺旋战绩等) 项目地址: https://gitcode.com/gh_mirrors/ge/GenshinPlayerQuery 还在为无法全面了解自己的原神账…...

如何在不同终端里面使用claude code并使用不同模型

在使用 Claude Code 开发项目时&#xff0c;我们可能会遇到这样的需求&#xff1a;一个终端使用速度更快、成本更低的模型处理日常代码修改&#xff0c;另一个终端使用推理能力更强的模型处理复杂问题。比如&#xff1a;一个终端用 deepseek-v4-pro[1m]&#xff0c;另一个终端用…...

Adafruit Bluefruit Playground:iOS与蓝牙开发板的物联网交互实战

1. 项目概述与核心价值 如果你手头有一块Adafruit的Circuit Playground Bluefruit或者CLUE开发板&#xff0c;想让它在你的iPhone或iPad上“活”起来&#xff0c;变成一个能远程控制彩灯、读取传感器数据甚至演奏音乐的智能玩具&#xff0c;那么Adafruit Bluefruit Playground …...

DeepMind CEO 访谈:人类离 AGI 只剩 4 年,只差最后 3 块拼图

作者&#xff1a;老纪的技术唠嗑局 楔子 前几天&#xff08;4 月 29 日&#xff09;&#xff0c;Google DeepMind CEO、2024 年诺贝尔化学奖得主 Demis Hassabis 在一期播客节目《Agents, AGI & The Next Big Scientific Breakthrough》[1] 中&#xff0c;预测 AGI&#…...

怎样快速删除背景?2026年免费工具实测对比,找到最简单的抠图方法

图片背景删除已经成为日常工作中的常见需求——无论是制作证件照、电商商品图&#xff0c;还是社交媒体头像&#xff0c;都离不开一个靠谱的背景去除工具。但市面上的工具五花八门&#xff0c;从专业软件到在线应用&#xff0c;从手机App到小程序&#xff0c;到底哪个才是最简单…...

别再死记硬背排序了!‘原地哈希’如何用交换搞定特定数组排序(保姆级图解)

别再死记硬背排序了&#xff01;‘原地哈希’如何用交换搞定特定数组排序&#xff08;保姆级图解&#xff09; 每次提到排序算法&#xff0c;你的第一反应是不是快速排序、归并排序这些经典方法&#xff1f;但面对特定场景的数组排序&#xff0c;这些"大炮打蚊子"式的…...

AI智能体技能库开发实战:从工具调用到系统集成

1. 项目概述&#xff1a;一个智能体技能库的诞生如果你正在研究或开发AI智能体&#xff0c;尤其是基于大型语言模型&#xff08;LLM&#xff09;的自主智能体&#xff0c;那么你一定遇到过这样的困境&#xff1a;智能体的核心能力&#xff0c;除了模型本身的理解和生成&#xf…...