【Java基础】ThreadLocal<LoginUser>:存储登录用户信息

news2024/11/25 20:27:52

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
    • 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 1. ThreadLocal 的基本概念
    • 2. LoginUser 类的设计
    • 3. 使用 ThreadLocal 存储 LoginUser
    • 4. 线程安全与内存泄露问题
    • 5. ThreadLocal 在 Web 应用中的使用
    • 6. 总结

在现代的 Web 应用开发中,用户状态的管理是一个核心问题。用户登录后,系统需要在多个请求之间保持用户的状态,以提供个性化的服务和权限控制。Java 提供了多种方式来实现这一功能,其中ThreadLocal<LoginUser>是一种非常高效且常用的方法。
在这里插入图片描述

1. ThreadLocal 的基本概念

ThreadLocal是 Java 提供的一个线程局部变量工具类,它能够为每个使用该变量的线程提供一个独立的变量副本。这意味着每个线程都可以访问到自己的变量副本,而不会影响到其他线程的变量副本。这种特性使得ThreadLocal非常适合用于存储线程特有的信息,比如数据库连接、用户会话信息等。

2. LoginUser 类的设计

在讨论如何使用ThreadLocal<LoginUser>之前,我们首先需要定义一个LoginUser类,用于封装用户的登录信息。这个类通常包含用户的基本信息,如用户 ID、用户名、权限列表等。

public class LoginUser {
    private Long userId;
    private String username;
    private List<String> authorities;

    // 构造方法、getter和setter方法
    public LoginUser(Long userId, String username, List<String> authorities) {
        this.userId = userId;
        this.username = username;
        this.authorities = authorities;
    }

    // 省略其他getter和setter方法
}

3. 使用 ThreadLocal 存储 LoginUser

在用户登录成功后,我们可以将LoginUser对象存储到ThreadLocal中。这样,后续的请求处理就可以通过ThreadLocal获取到当前线程对应的用户信息。

public class UserContext {
    private static final ThreadLocal<LoginUser> userHolder = new ThreadLocal<>();

    public static void setLoginUser(LoginUser loginUser) {
        userHolder.set(loginUser);
    }

    public static LoginUser getLoginUser() {
        return userHolder.get();
    }

    public static void clear() {
        userHolder.remove();
    }
}

4. 线程安全与内存泄露问题

虽然ThreadLocal提供了线程隔离的存储空间,但如果不正确地管理,可能会导致内存泄露。这是因为ThreadLocal的键(Key)是弱引用,而值(Value)是强引用。如果线程长时间运行,而没有及时清理ThreadLocal变量,那么这些变量将不会被垃圾回收器回收,从而导致内存泄露。

为了避免这种情况,我们应该在用户会话结束或者请求处理完成后,及时清理ThreadLocal中的值。

UserContext.clear();

5. ThreadLocal 在 Web 应用中的使用

在 Web 应用中,每个请求通常由一个线程处理。我们可以在请求开始时,将用户信息设置到ThreadLocal中,在请求处理过程中,通过ThreadLocal获取用户信息,请求结束后清理ThreadLocal

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 用户登录逻辑
        LoginUser loginUser = authenticate(request);
        if (loginUser != null) {
            UserContext.setLoginUser(loginUser);
        }
    }
}

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        UserContext.clear();
        // 跳转到登录页面
    }
}

6. 总结

在这里插入图片描述

ThreadLocal<LoginUser>提供了一种高效的方式来存储和管理登录用户的会话信息。通过为每个线程提供独立的用户信息副本,我们可以确保线程安全,并且可以轻松地在请求处理过程中获取用户信息。然而,正确地管理ThreadLocal变量的生命周期,避免内存泄露,是使用ThreadLocal时需要注意的重要问题。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

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

相关文章

【一篇文章搞定】LVGL显示中文+解决keil下LVGL无法正常显示中文及error:#8:missing closing quote问题

LVGL显示中文 进入lvgl中文文档&#xff1a;显示中文 — LVGL 文档 (100ask.net) 下载字体zip文件&#xff0c;解压得到一个.otf文件 进入LVGL的字体转换网站 Font Converter — LVGL 1.点击Browse指定.otf文件即可 2.range不用管 3.为了节省内存在Symbols中输入自己要使用的…

【计算机网络】概述篇

目录 导学 计算机网络的发展简史 互联网的发展历史 中国互联网的发展历史 计算机网络的层次结构 层次结构设计的基本原则 OSI七层模型 TCP/IP四层模型 现代互联网的网络拓扑 计算机网络的性能指标 速率 时延 发送时延 ​传播时延 ​排队时延 处理时延 总时延 …

K8S - Emptydir - 取代ELK 使用fluentd 构建logging saidcar

由于k8s 的无状态service 通常部署在多个POD中&#xff0c; 实现多实例面向高并发。 但是k8s 本身并没有提供集中查询多个pod的日志的功能 其中1个常见方案就是ELK. 本文的方案是 利用fluentd sidecar 和 emptydir 把多个pod的日志导向到bigquery的table中。 Emptydir 的简介 …

STM32F407ZGT6单片机HAL库——DAC输出

一、输出直流电压 1.cubemax的配置&#xff08;通道1&#xff09; 2.直流电压大小计算 3.主函数加入初始化的程序 float DAC_voltage1.5;HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, DAC_voltage*4095/3.3);//HAL_DAC_Start(&hdac,DAC_CHANNEL_1); 二、…

深度解析价值流:推动业务架构创新与效益提升的核心指南

数字化转型下的价值流管理与架构 在当今的数字化转型背景下&#xff0c;如何有效创造并交付价值&#xff0c;成为企业竞争力提升的关键课题。作为企业架构的重要组成部分&#xff0c;价值流的概念为业务决策者和技术人员提供了全面的工具&#xff0c;帮助优化业务能力&#xf…

java,php,go,nodejs,Python开发web项目优缺点对比

Java 优点:java 是一门广泛应用于企业级开发的语言,丰富且庞大的开发框架和库。有较高的性能和可伸缩性。生态系统庞大且成熟,拥有大量的开源框架和工具,可以加速开发过程。 内置对多线程的支持,适合处理高并发的 Web 项目。 缺点:相比其他语言,Java 的语法相对冗长繁琐…

Linux-Shell编程【看这一篇就够了!!!】

目录 前言 什么是Shell编程 Shell脚本的执行方式 脚本格式要求 运行一个Shell 一个Shell例子 Shell的变量 shell变量的定义 设置环境变量 简单示范 位置参数变量 预定义变量 基本语法 运算符 应用案例 条件判断 单流程判断 常用判断条件 应用案例 多流程判…

Type-C 接口 取电 PD快充协议取电电压5V、9V、15V、20V

随着Type-C接口的普及&#xff0c;快充技术融入进了各种电子设备中&#xff0c;然而快充技术里快充协议是必不可少的&#xff0c;目前市面上已经出现多种快充协议&#xff0c;最常见的便是Type-C PD协议&#xff0c;下面来以起了解以下PD协议。 PD协议的工作原理主要是基于电压…

【OpenCV】灰度化和二值化处理图像

文章目录 1. 图像灰度化处理对比2. 代码示例3. 二值化处理 1. 图像灰度化处理对比 2. 代码示例 #include <opencv2/opencv.hpp> using namespace cv;int main() {Mat currentImage imread("path_to_image.jpg"); // 读取彩色图像Mat grayImage;// 将彩色图像…

负债不再是障碍?银行信贷“白名单“揭秘

谈及银行信贷产品&#xff0c;常闻有言称存在无需考量负债与查询记录之奇品&#xff0c;此等说法十有八九为中介诱人上钩之辞。轻信之下&#xff0c;恐将步入连环陷阱。除非个人资质出类拔萃&#xff0c;如就职于国央企或事业单位&#xff0c;工龄逾年&#xff0c;五险一金完备…

计算机毕业设计选题推荐-土地承包管理系统-Java/Python项目实战(亮点:数据可视化分析、账号锁定、智能推荐)

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Address localhost:1099 is already in use:tomcat频繁重启端口占用问题

错误提示 Unable to open debugger port (127.0.0.1:58198): java.net.SocketException "Socket closed" Address localhost:1099 is already in use 端口被占用 报错原因 由于短时间内频繁运行tomcat服务器。 为了避免出现这一错误。可以点击刷新uodate resourc…

寻找客户资源的软件

如果你正在寻找能够帮助你高效寻找客户资源的软件&#xff0c;以下几款工具可以为你提供支持&#xff1a; 1. 微拓客APP 微拓客APP是一款专为企业和销售人员设计的智能拓客工具。它通过最新的全国工商数据&#xff0c;帮助你精准搜索目标客户&#xff0c;特别适合需要快速找到…

软件开发人员从0到1实现物联网项目:项目架构的思考

文章目录 前言单体应用足矣摒弃传统的微信对接后期的维护投入上真正的“云”&#xff1a;云托管0服务器免运维免费的CDN和DDoS防护 技术架构小结 前言 因为种种原因&#xff0c;《软件开发人员从0到1实现物联网项目》这个项目的进度停滞了将近一个月。 鉴于该项目的前期开发和…

优化销售流程,领先市场趋势!企元数智赠送小程序合规分销系统!

在当今竞争激烈的商业环境中&#xff0c;企业要保持竞争力并领先市场趋势&#xff0c;关键在于不断优化销售流程和采用最新的营销工具。为满这一迫切需求&#xff0c;企元数智&#xff08;假设为一家虚构公司&#xff09;推出了一项创新举措&#xff1a;赠送小程序合规分销系统…

景联文科技:专业数据标注公司,推动AI技术革新

数据标注作为AI技术发展的重要支撑&#xff0c;对于训练高质量的机器学习模型以及推动应用领域的创新具有不可替代的作用。 景联文科技作为专业的数据标注公司&#xff0c;致力于提供专业的数据标注服务&#xff0c;帮助客户解决AI链条中的数据处理难题&#xff0c;共同推动人工…

沃尔玛活跃卖家一年内增长50%,突破15万!沃尔玛新店铺如何快速出单?

随着美国电商市场竞争日益激烈&#xff0c;沃尔玛正在迅速崛起成为亚马逊的强劲对手。据最新财报显示&#xff0c;2024年第二季度&#xff0c;沃尔玛的全球广告收入增长了26%&#xff0c;其中专注于美国市场的Walmart Connect更是取得30%的增长&#xff0c;这一成绩已经超越了其…

Java笔试面试题AI答之单元测试JUnit(4)

文章目录 19. 简述JUnit org.junit.TestSuite类的作用 &#xff1f;1. 组织测试类2. 简化测试执行3. 灵活配置测试环境4. 嵌套测试套件注意事项 20. 在JUnit中Test注释的作用和用法 &#xff1f;作用用法 21. 简述Junit 基础注解&#xff08;BeforeClass、Before、Test、After、…

Java--集合进阶 Collection,迭代器,lambda表达式

集合体系结构 Collection&#xff1a;单列集合 LIst系列集合&#xff1a;添加的元素是有序、可重复、有索引 Set系列集合&#xff1a;添加的元素是无序、不重复、无索引 Collection集合常用方法 | 方法名 | 说明 || :---…

双设备同时快充不再是梦:揭秘一拖二快充线PD芯片的奥秘

一拖二快充线PD芯片&#xff1a;充电新纪元&#xff0c;让生活更“电”力十足&#xff01; 在这个快节奏的时代&#xff0c;手机、平板、耳机……我们的数字小伙伴们几乎从不离身&#xff0c;但它们的电量却总爱跟我们玩“躲猫猫”。每当夜幕降临&#xff0c;充电线就成了连接我…