Springboot使用ThreadLocal提供线程局部变量,传递登录用户名

文章目录

  • 概述
  • 使用
    • 创建ThreadLocalUtil工具类
    • 在登录拦截器中使用ThreadLocal存储登录用户名
    • 在/userInfo接口中获取登录用户名
  • 注意事项
  • 参考视频


概述

在这里插入图片描述
在这里插入图片描述

使用

创建ThreadLocalUtil工具类

utils/ThreadLocalUtil.java

package org.example.utils;/*** ThreadLocal 工具类*/
@SuppressWarnings("all")
public class ThreadLocalUtil {//提供ThreadLocal对象,private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();//根据键获取值public static <T> T get(){return (T) THREAD_LOCAL.get();}//存储键值对public static void set(Object value){THREAD_LOCAL.set(value);}//清除ThreadLocal 防止内存泄漏public static void remove(){THREAD_LOCAL.remove();}
}

在登录拦截器中使用ThreadLocal存储登录用户名

interceptors/LoginInteceptor.java

//将解析用户名保存到ThreadLocal中
ThreadLocalUtil.set(claims);

在这里插入图片描述
请求处理完成后,清空ThreadLocal中的数据,防止内存泄漏

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 请求处理完成后,清空ThreadLocal中的数据ThreadLocalUtil.remove();
}

在这里插入图片描述

在/userInfo接口中获取登录用户名

controller/UserController.java

//从threadLocal中获取用户信息
Map<String, Object> claims = ThreadLocalUtil.get();
String username = (String) claims.get("username");

在这里插入图片描述

注意事项

在这里插入图片描述

参考视频

https://www.bilibili.com/video/BV14z4y1N7pg?spm_id_from=333.788.player.switch&vd_source=0467ab39cc5ec5940fee22a0e7797575&p=23

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/78921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1399. 统计最大组的数目

1399. 统计最大组的数目 题目链接&#xff1a;1399. 统计最大组的数目 代码如下&#xff1a; class Solution { public:int countLargestGroup(int n) {int res 0;unordered_map<int, int> um;int maxValue 0;for (int i 1;i < n;i) {string value to_string(i);…

VS Code 插件Git History Diff 使用

右上角 查看单个文件记录

数学建模论文手的学习日常01

目录 一.要写的内容&#xff1a; 二.文章标题&#xff1a; 三.摘要&#xff08;非常非常非常重要&#xff09; 四、关键词&#xff1a; 五、问题重述 六、模型假设 七、符号说明 八、模型的建立与求解 九、模型的分析与检验 十、模型的评价、改进与推广 十一、参考…

深度学习: AI 体育领域

一、引言 在科技与体育深度融合的当下&#xff0c;AI 体育逐渐成为推动体育行业变革的重要力量。深度学习凭借其强大的数据分析与模式识别能力&#xff0c;为 AI 体育带来了全新的发展机遇。从运动员动作分析到智能健身指导&#xff0c;从赛事预测到运动康复辅助&#xff0c;深…

在 Ubuntu24.04 LTS 上 Docker 部署英文版 n8n 和 部署中文版 n8n-i18n-chinese

一、n8n 简介 n8n 是一个低代码&#xff08;Low-Code&#xff09;工作流自动化平台&#xff0c;可以帮助用户以非常简单的方式创建自动化流程&#xff0c;连接不同的应用程序和服务。n8n的设计理念是为了让复杂的工作流变得简单易用&#xff0c;同时也支持高度的自定义&#xf…

《系统分析师-第三阶段—总结(八)》

背景 采用三遍读书法进行阅读&#xff0c;此阶段是第三遍。 过程 本篇总结第15章的内容 第15章 总结 系统运行与维护&#xff0c;系统经过测试交付之后&#xff0c;进入运行维护阶段&#xff0c;维护分为系统运行、故障维护、系统评价和系统相关的策略。 疑问&#xff1a;…

LeetCode 1295.统计位数为偶数的数字:模拟

【LetMeFly】1295.统计位数为偶数的数字&#xff1a;模拟 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-numbers-with-even-number-of-digits/ 给你一个整数数组 nums&#xff0c;请你返回其中位数为 偶数 的数字的个数。 示例 1&#xff1a; 输入&#xff1…

DDD是什么?电商系统举例

一、DDD的基本概念 领域驱动设计&#xff08;Domain-Driven Design&#xff0c;简称DDD&#xff09;是由Eric Evans提出的一种软件开发方法论&#xff0c;旨在应对复杂业务系统的设计和实现。它的核心思想是将软件的设计与业务领域紧密结合&#xff0c;通过深入理解业务需求&a…

K8S ConfigMap 快速开始

一、什么是 ConfigMap&#xff1f; ConfigMap 是 Kubernetes 中用于存储非敏感配置数据的 API 对象&#xff0c;支持以键值对&#xff08;Key-Value&#xff09;或文件的形式存储配置&#xff0c;允许将配置与镜像解耦&#xff0c;实现配置的集中管理和动态更新。 二、主要用…

Prometheus使用Recoding Rules优化性能

通过PromQL可以实时对Prometheus中采集到的样本数据进行查询&#xff0c;聚合以及其它各种运算操作。而在某些PromQL较为复杂且计算量较大时&#xff0c;直接使用PromQL可能会导致Prometheus响应超时的情况。这时需要一种能够类似于后台批处理的机制能够在后台完成这些复杂运算…

C++ RAII 编程范式详解

C RAII 编程范式详解 一、RAII 核心概念 RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;资源获取即初始化&#xff09; 是 C 的核心编程范式&#xff0c;通过将资源生命周期与对象生命周期绑定实现安全、自动化的资源管理。 核心原则&#xff1a; 资源…

Rust 学习笔记:枚举与模式匹配

Rust 学习笔记&#xff1a;枚举与模式匹配 Rust 学习笔记&#xff1a;枚举与模式匹配定义枚举&#xff08;Enum&#xff09;枚举变量Option 枚举及其相对于 NULL 的优势match 和枚举与 Option\<T\> 匹配match 应该是详尽的Catch-all 模式和 _ 占位符使用 if let 和 let e…

《WebGIS之Vue进阶教程》(13)ref的实现

1 为什么需要ref 由于proxy只能代理引用类型数据(如: 对象, 数组, Set, Map...), 需要一种方式代理普通类型数据(String, Number, Boolean...) 设计ref主要是为了处理普通类型数据, 使普通类型数据也具有响应式 除此之外, 通过reactive代理的对象可能会出现响应丢失的情况. 使…

Redis 缓存并发问题深度解析:击穿、雪崩与穿透防治指南

Redis-缓存并发 引言&#xff1a;缓存&#xff0c;高性能架构的基石与并发挑战一、 缓存击穿&#xff1a;热点 Key 失效引发的“单点风暴”1.1 什么是缓存击穿&#xff1f;1.2 缓存击穿的风险1.3 缓存击穿的解决方案1.3.1 互斥锁&#xff08;Mutex Lock&#xff09;/ 分布式锁 …

Python 数据智能实战 (4):智能用户分群 - 融合行为

写在前面 —— 超越 RFM 标签,结合用户行为与 LLM 文本洞察,实现更精准、更立体的客户细分 欢迎回来!在前面的学习中,我们已经为 Python 数据智能工具箱添置了与大语言模型 (LLM) 交互的能力,特别是掌握了如何利用 LLM 将非结构化的文本信息转化为包含深层语义的数值向量…

FreeMarker语法深度解析与Node.js集成实践指南

一、FreeMarker核心语法体系 1.1 基础模板结构 <#-- 注释语法 --> ${expression} <#-- 输出表达式 --> <#directive paramvalue> <#-- 指令语法 -->1.2 数据类型处理 标量类型深度处理&#xff1a; <#assign num 123.45?floor> <#--…

【计算机视觉】目标检测:深度解析YOLOv5:下一代实时目标检测框架实战指南

深度解析YOLOv5&#xff1a;下一代实时目标检测框架实战指南 技术演进与架构设计YOLO系列发展脉络YOLOv5核心架构1. 骨干网络&#xff08;Backbone&#xff09;2. 特征融合&#xff08;Neck&#xff09;3. 检测头&#xff08;Head&#xff09; 环境配置与快速开始硬件要求建议详…

STM32 定时器TIM

定时器基础知识 定时器就是用来定时的机器&#xff0c;是存在于STM32单片机中的一个外设。STM32总共有8个定时器&#xff0c;分别是2个高级定时器(TIM1、TIM8)&#xff0c;4个通用定时器(TIM2、TIM3、TIM4、TIM5)和2个基本定时器(TIM6、TIM7)&#xff0c;如下图所示: STM32F1…

OpenObserve API Usage Guide for Log Management

OpenObserve API Usage Guide for Audit Log Management 1. 概述 1.1 目标 本文档旨在详细介绍 OpenObserve 的 API 使用方法&#xff0c;帮助用户通过 API 实现日志管理功能&#xff0c;包括日志摄入、查询、模糊匹配&#xff08;类似 SQL 的 LIKE&#xff09;、stream 管理…

消防岗位技能竞赛流程方案策划

一、比赛目的&#xff1a; 为大力倡导“11.9”全国消防安全活动月&#xff0c;紧紧围绕“人人参与消防&#xff0c;共创平安和谐”的活动主题&#xff0c;结合公司实际情况&#xff0c;特开展一次消防技能竞赛活动。开展一场比思想、比工作作风、比消防业务技能、比业余文化生…