TransmittableThreadLocal获取当前登录用户
要使用TransmittableThreadLocal
实现用户登录后记录用户信息,并在用户退出时清除信息,你可以按照以下步骤进行:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
<version>2.12.0</version>
</dependency>
1. 定义用户信息类
首先定义一个用户信息类,用于存储用户的相关信息。
public class UserInfo {
private String userId;
private String username;
// 其他用户信息字段
// 构造器、getter、setter 省略
}
2. 创建 TransmittableThreadLocal 实例
创建一个TransmittableThreadLocal
实例,用于存储当前线程的用户信息。
import com.alibaba.ttl.TransmittableThreadLocal;
public class UserContextHolder {
private static final TransmittableThreadLocal<UserInfo> userContext = new TransmittableThreadLocal<>();
public static void set(UserInfo userInfo) {
userContext.set(userInfo);
}
public static UserInfo get() {
return userContext.get();
}
public static void clear() {
userContext.remove();
}
}
3. 用户登录逻辑
在用户登录的逻辑中,设置用户信息到TransmittableThreadLocal
。
public class UserService {
public void login(String username, String password) {
// 登录逻辑,假设登录成功
UserInfo userInfo = new UserInfo();
userInfo.setUserId("123");
userInfo.setUsername(username);
// 设置其他用户信息
// 登录成功后,设置用户信息到 TransmittableThreadLocal
UserContextHolder.set(userInfo);
}
public void logout() {
// 登出逻辑
// 清除 TransmittableThreadLocal 中的用户信息
UserContextHolder.clear();
}
}
4. 在业务逻辑中使用用户信息
在任何业务逻辑中,你可以通过UserContextHolder
获取当前登录用户的信息。
public class BusinessService {
public void doBusiness() {
UserInfo userInfo = UserContextHolder.get();
if (userInfo != null) {
// 使用用户信息进行业务处理
System.out.println("User ID: " + userInfo.getUserId());
System.out.println("Username: " + userInfo.getUsername());
} else {
// 用户未登录,处理未登录逻辑
}
}
}
5. 结合线程池使用
当你在使用线程池执行任务时,确保使用TtlRunnable
或TtlCallable
来包装任务,以便TransmittableThreadLocal
能够在任务间传递用户信息。
import com.alibaba.ttl.TtlRunnable;
public class ThreadPoolExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
// 假设用户已登录并设置了用户信息
UserService userService = new UserService();
userService.login("user1", "password");
// 提交任务到线程池
Runnable task = new BusinessService()::doBusiness;
executorService.submit(TtlRunnable.get(task));
// 用户退出登录
userService.logout();
// 关闭线程池
executorService.shutdown();
}
}
以上代码示例展示了如何使用TransmittableThreadLocal
来记录用户信息,并在用户登录和退出时进行设置和清除。在实际应用中,你需要根据具体的业务逻辑和安全要求来调整和完善这些代码。
不积跬步,无以至千里;不积小流,无以成江海。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2018-12-23 GC垃圾回收机制