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. 结合线程池使用

当你在使用线程池执行任务时,确保使用TtlRunnableTtlCallable来包装任务,以便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来记录用户信息,并在用户登录和退出时进行设置和清除。在实际应用中,你需要根据具体的业务逻辑和安全要求来调整和完善这些代码。

posted @   亲爱的阿道君  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2018-12-23 GC垃圾回收机制
点击右上角即可分享
微信分享提示