通过ThreadLocal存储登录用户信息

使用ThreadLocal存储用户登录信息 java代码解读复制代码= null?= null?= null?do { if (!} while(!= null?} }java代码解读复制代码} } }总结,就是在过滤器这边查询用户信息,存储到中java代码解读复制代码} }解释静态变量(static variable)是一种特殊的变量,它们属于类本身,而不是实例对象。静态变量是在类加载时初始化的,并且它们的生命周期是整个应用程序的生命周期。对于变量,情况略有不同。变量是线程局部变量,它们的生命周期是与线程相关的。 阅读详情

前言

项目中经常需要用到登录用户信息,spring项目中可以选择通过ThreadLocal存储登录用户信息。

优点

  1. 线程隔离:ThreadLocal 能为每个使用它的线程都提供一个独立的变量副本。在多线程环境下,每个线程对 ThreadLocal 变量的操作都是相互独立的,不会相互影响。在存储登录用户信息时,这意味着不同线程可以同时存储和访问各自的登录用户信息,避免了多线程并发访问共享变量时需要进行的同步操作,从而提高了程序的性能和安全性。
  2. 简化代码:使用 ThreadLocal 可以避免在方法调用过程中频繁传递用户信息。在需要获取登录用户信息的地方,直接从 ThreadLocal 中获取即可,而不需要将用户信息作为参数在各个方法之间传递,使代码更加简洁和易于维护。
  3. 上下文关联:ThreadLocal 可以将登录用户信息与当前线程关联起来,使得在整个线程的执行过程中,都可以方便地获取到该用户信息。这对于一些需要在多个方法或组件中使用用户信息的场景非常有用,例如权限验证、日志记录等。
  4. 与请求生命周期一致:通常与web请求的生命周期绑定,请求结束时自动清理

实现细节

1. 基本实现

public class UserContext {
    private static final ThreadLocal<UserInfo> userHolder = new ThreadLocal<>();
    
    public static void setUser(UserInfo user) {
        userHolder.set(user);
    }
    
    public static UserInfo getUser() {
        return userHolder.get();
    }
    
    public static void clear() {
        userHolder.remove();
    }
}

2. Web应用中的完整实现(以Spring为例)

// 拦截器实现
@Component
public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String token = request.getHeader("Authorization");
        LoginUser user = authService.verifyToken(token);
        UserContext.setUser(user);
        return true;
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
                               Object handler, Exception ex) {
        UserContext.clear(); // 确保请求结束后清理,避免内存泄漏
    }
}

// 配置拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private AuthInterceptor authInterceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor)
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/login");
    }
}

3. 使用示例

@RestController
@RequestMapping("/api/user")
public class UserController {
    
    @GetMapping("/profile")
    public ResponseEntity<UserProfile> getProfile() {
        LoginUser currentUser = UserContext.getUser();
        // 使用currentUser进行业务处理...
    }
}

注意事项

  • 内存泄漏风险:

必须确保在请求结束时调用remove()清理

在Web应用中,通常使用拦截器的afterCompletion进行清理

  • 线程池问题:

如果使用线程池,线程会被重用,必须确保每次使用前清理旧数据

建议在任务执行前后进行set/remove操作

  • 不可变对象:

存储的用户信息最好是不可变对象,避免被意外修改

  • 测试考虑:

在单元测试中需要手动设置ThreadLocal或使用Mock

  • 异步编程:

在异步场景下(如CompletableFuture),需要手动传递上下文

ThreadLocal是实现请求级上下文信息的轻量级解决方案,特别适合存储登录用户信息这类与请求生命周期一致的数据。

token登录 threadlocal存储当前用户信息 碎碎念: 之前写的毕设的登录都就是“select * from user where username = name and password = pwd;”这种很简单的,也没做token校验。这次让我写个登录功能,包括token校验,用threadlocal存储用户信息,密码加密。 做登录的时候我遇到了很多问题,当然其中也有蛮多傻*问题,就是因为自己绕不清,这次写个文章整理一下。 我遇到的问题:(因为没认真写过登录,就是个小白,所以很多问题都很无脑) 密码加密了,我要怎么去库里捞用户了,密码加密不是每 阅读详情

相关推荐

权限管理系统 ThreadLocal的使用:在同一线程中获取用户信息

ThreadLocal的使用:在同一线程中获取用户信息 /*****************************************************************************************/ public class ThreadUtils implements Runnable { private static class ThreadUti

总要有一个梦想或大或小 5106

ThreadLocal保存用户信息

ThreadLocal

qq_42582773的博客 3109

蓄热式加热炉燃烧技术

蓄热式加热炉燃烧技术

weixin_37928884的博客 2732

一种新的方法来存储用户信息——ThreadLocal

对于session中的用户信息,我们不仅想要在action中随用随取,还想在其它普通类中取,即使不依赖servlet api, 我们也要在方法里随用随取,我们在处理请求的时候,很多操作都要获取当前用户的ID等信息,由上可见,我们凡是在action的方法中任何一处想要获取session中的用户信息,则必须要先手动获取到HttpServletRequest,是不是比较麻烦。顾名思义,就是本地线程,可是这个名字实在容易让人误解,因为其实它是本地线程局部变量的意思,首先我们要知道,我们每个请求都会对应一个线程,

tigerhhzz的博客 2611

大红球预警版-精选+自定义板块监控

这是一款简单易用的股票大单资金监控插件,兼容通达信软件,可嵌入分时图或定制版面。它以红绿圆球直观显示主力买卖情况(红球为买,绿球为卖),支持300万以上大单语音播报。插件提供实时资金流向分析、多股同时监控、自定义预警条件等功能,无需L2账号。用户可自由切换图形/列表模式,监控特定板块,并配合幻影软件实现自动交易。虽然上涨股通常红球占优,但需结合其他指标综合判断。该插件完全免费,包含详细视频教程,适合新手使用。

guleba的博客 1791

Vivado安装教程:多版本共存的配置技巧

详解Vivado安装教程中的多版本共存配置技巧,帮助用户在同一系统中管理不同版本的Vivado开发环境,提升开发效率与兼容性,适用于需要切换版本的FPGA开发者。

weixin_35257663的博客 1768

ThreadLocal实现登录(保存用户登录信息)

ThreadLocal可以将用户信息保存在线程中,当请求结束后我们在把保存的信息清除掉。这样我们才开发的时候就可以直接从全局的ThreadLocal中很方便的获取用户信息。使用ThreadLocal,可以在同一线程中很方便的获取用户信息,不需要频繁的传递session对象。在日常开发中我们可以根据自己需要去获取用户信息,比如从token解析等ThreadLocal类: 拦截器:在方法中根据自己的需要将用户的登录信息存放之ThreadLocal中即可。然后最后记得清除相关数据以避免内存泄漏 注册自定义

huing的博客 5694

英飞凌TC377的Flash管理、UCB配置与HSM安全机制解析

本文深入解析了英飞凌TC377微控制器的Flash存储结构、UCB配置机制与HSM安全模块。详细阐述了带Cache与不带Cache的PFlash地址访问差异、利用SOTA与AB Swap实现无感OTA更新的原理,以及如何通过UCB安全配置启动流程与写保护。重点剖析了HSM硬件安全模块在密钥管理、安全启动与安全OTA中的核心作用,为开发高可靠性嵌入式系统提供实战指南。

weixin_29170327的博客 520

使用 ThreadLocal 来存储用户信息

ThreadLocal 来存储用户信息

随风why 861

Python 爬虫实战:豆瓣电影海报批量获取(Top250 榜单 + 可视化展示)

在信息爆炸的时代,数据已成为决策的核心,而数据的获取是数据分析的第一步。本文将详细介绍如何利用 Python 爬虫获取豆瓣电影 Top250 榜单的海报,并对数据进行可视化展示,助你更好地了解电影市场的趋势和用户的喜好。

yansideyucsdn的博客 717

SolidWorks 小车底盘 装配体

通过制作小车底盘了解solidworks装配体的部分知识

及时总结 2226

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

在现代的 Web 应用开发中,用户状态的管理是一个核心问题。用户登录后,系统需要在多个请求之间保持用户的状态,以提供个性化的服务和权限控制。Java 提供了多种方式来实现这一功能,其中是一种非常高效且常用的方法。提供了一种高效的方式来存储和管理登录用户的会话信息。通过为每个线程提供独立的用户信息副本,我们可以确保线程安全,并且可以轻松地在请求处理过程中获取用户信息。然而,正确地管理变量的生命周期,避免内存泄露,是使用时需要注意的重要问题。👍🏻呗。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 3万+

Chrome下载B站视频字幕的插件

本文主要介绍了Chrome下载B站视频字幕的插件,希望能对使用Chrome的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 3万+

ThreadLocal存储当前登录用户信息

将登录用户存入ThreadLocal

Emmien的博客 2045

【超详细】计算机组成原理总结及思维导图

计算机组成 第一章 计算机系统概论 冯诺依曼型计算机特点 1.计算机由运算器,控制器,存储器,输入和输出设备5部分组成 2.采用存储程序的方式,程序和数据放在同一个存储器中,并以二进制表示。 3.指令由操作码和地址码组成 4.指令在存储器中按执行顺序存放,由指令计数器(即程序计数器PC)指明要执行的指令所在的储存单元地址,一般按顺序递增,但可按运算结果或外界条件而改变 5.机器以运...

圣三一 10万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

登录拦截器+ThreadLocal实现用户信息存储

【代码】登录拦截器+ThreadLocal实现用户信息存储。

LeGuan_Ha的博客 1647

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

用户登录信息保存在ThreadLocal中

说明 : 简单说下我写这篇文章的来由吧,最近准备新开一个项目前后端分离的,后端通过springboot实现,前段就不说了,那么就会考虑到用户登录成功以后登录信息保存在什么地方,是通过前后端一直传递参数么,那就蛋疼了。通过session存储信息。。那不是要每次都要在视图层获取session在一层一层的传递下去。。想了想通过ThreadLocal来存储用户信息吧,这样就可以直接在dao层调用了。说干就...

QingFeng-Li的博客 2万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

使用ThreadLocal保存用户登录信息

使用ThreadLocal替代Session完成保存用户登录信息功能 具体实现流程: 在登录业务代码中,当用户登录成功时,生成一个登录凭证存储到redis中,将凭证中的字符串保存在cookie中返回给客户端。 使用一个拦截器拦截请求,从cookie中获取凭证字符串与redis中的凭证进行匹配,获取用户信息,将用户信息存储到ThreadLocal中,在本次请求中持有用户信息,即可在后续操作中使用到用户信息。 登录凭证类: //登录凭证表 @Data @ApiModel("登录凭证类") public

qq_42804736的博客 1万+

springboot 登录拦截器,ThreadLocal的使用样列

springboot 登录拦截器,ThreadLocal的使用样列

qq_43648079的博客 402

ThreadLocal在开发中的一种应用

在处理请求的过程中,许多业务逻辑都需要获取当前登录用户的信息。例如,如下图,我们在开发 添加业务 时,在后台数据库需要填写字段:create_user和update_user,这时就需要当前登录用户的信息。其内部实现通常依赖于一个ThreadLocalMap,该Map的键(key)是ThreadLocal对象本身,值(value)则是为当前线程存储的变量副本。但是问题在于:JWT的解析及校验我们写在了拦截器中,问题在于拦截器类中的参数很难传递到service类中。要动态获取当前登录者的ID,可以从。

yssssssssss111的博客 277

ThreadLocal配合登录使用

很多系统登录之后会把用户信息存到rides中,因为代码中要获取当前登录人, 获取当前登录人的方法是前端传过来token,解析token来获取缓存的中用户信息,方法很多,大概都离不开token 如果单纯从请求里面获取token,那子线程是获取不到当前登录人的,所以,可以把tokne存到ThreadLocal里面 实现代码如下: public class TokenHolder { private static final ThreadLocal<String> CACHE = new Inheri

weixin_49294542的博客 667

ThreadLocal全局获取用户信息

场景需求 : 虽然在登录之后,前端可以获取到我所返回的jwt,然后通过它保持登录状态和获取信息。然后在调用接口的时候将信息传递给我进行各种操作。 但是种种原因问题,我需要很简便地在执行操作的过程中,在任何一个方法中都能获取到当前用户的一些基本信息。 而不纯粹依赖前端传值。 因为并非所有方法都可以拿到jwt,如果没有请求头作为参数的话。 我设想了一种简便的实现方式,就是在请求通过jwtFilter的...

zsj777的专栏 4560

如何使用ThreadLocal存储用户登录信息?

一般我们需要获取当前用户信息,不知道大家脑海里第一印象会是什么呢?用户登录的时候将用户信息保存到缓存中?或者每次解析token,然后一层一层的传递?这样会不会导致代码太过耦合呢。那我们如何解决这种问题呢? 没错,我们可以使用ThreadLocal来解决该问题。ThreadLocal可以将用户信息保存在线程中,当请求结束后我们在把保存的信息清除掉。这样我们才开发的时候就可以直接从全局的ThreadLocal中很方便的获取用户信息。 实现该功能很简单,总共分为三个步骤: 首先创建ThreadLocal类,在其

Java是世界上最好的语言 7555

为什么要使用 ThreadLocal 进行登录时处理用户信息?而非普通变量?

为什么要使用 ThreadLocal 进行登录时处理用户信息?而非普通变量? 假如有两个用户 A 和 B,他们分别进行登录,并且他们的每次请求都会带有自己的 token,在请求到达 controller 之前(preHandle() 中),每次都会被会被拦截器进行拦截,提取出当前 token 中的用户信息(比如 userId),认证通过以后在 service 中就可以通过 Contenxt 类获取提取出来的用户信息。 前提 Context 类中存储用户的 ID,有一个静态的变量或者对象叫做 USER_ID

Wow 五六 !!! 的博客 3395

用类配置的登录拦截器+用ThreadLocal存储session上的登录用户

拦截器配置类 /** * 加入拦截器的配置 :用于拦截用户的请求,判断是否已经登录 * 如果已经登录(session有值)进行请求的放行 */ @Configuration public class InterceptorConfig implements WebMvcConfigurer { // 登录拦截器的创建 // 本注解用于创建Spring MVC的拦截器对象 @Bea...

weixin_43281120的博客 1124

使用ThreadLocal保存当前线程的用户信息

1. 在JWTFilter(继承自BasicHttpAuthenticationFilter)的executeLogin方法中做判断,如果登陆成功,则将用户信息存入UserUtil.set(user); 2. UserUtil类: public class UserUtil { private UserUtil(){ } private static final ThreadLo...

qq_28060549的博客 5015
上一篇: java.lang.OutOfMemoryError: GC overhead limit exceeded如何解决
下一篇: springboot国家化多语言实现
bxp1321
博客等级 码龄17年 146粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值