使用ThreadLocal获取当前线程的用户ID错误

11 阅读1分钟

说明:LocalThread是线程变量,可以往该线程变量中填充我们项目用户的ID,可以在其他的业务代码中直接获取,十分方便,详细参考:t.csdn.cn/k75rs

LocalThread使用

第一步:创建类

创建一个TokenThreadLocal,作用是存放用户的ID

/**
 * 本地线程池
 *
 * 存放用户ID
 */
public class TokenThreadLocal {
    
    /**
     * 创建一个ThreadLocal对象
     */
    private static final ThreadLocal<Long> THREAD_LOCAL= new ThreadLocal<>();

    /**
     * 添加一个数据
     * @param key
     */
    public static void set(Long key){
        THREAD_LOCAL.set(key);
    }

    /**
     * 获取一个数据
     * @return
     */
    public static Long get(){
        return THREAD_LOCAL.get();
    }

    /**
     * 删除一个数据
     */
    public static void remove(){
        THREAD_LOCAL.remove();
    }
}

第二步:填充变量值

在用户通过登录时,将用户的id填充到线程对象中

在这里插入图片描述

第三步:使用

可以在任何需要的地方直接使用,比如修改当前用户密码、新增记录时设置新增该记录的create_user_id

在这里插入图片描述

第四步:移除

需要在线程结束时,移除该线程对象。如果使用的是拦截器,可在afterCompletion()方法内调用移除方法

    /**
     * 请求到客户端之后会执行的方法
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        TokenThreadLocal.remove();
    }

注意事项&错误

注意

使用LocalThread需要注意以下两点,不然会发生内存泄漏,详细参考:t.csdn.cn/3Z2Jf

(1)变量需要使用private static final修饰;

(2)需要记住调用LocalThread的remove()方法;

错误

如果发现在使用时,获取用户ID,结果为null 在这里插入图片描述

分析&解决:需要检查,在给用户发放Token时,有没有把用户的ID传入到Map中; 在这里插入图片描述

首次发布

hezhongying.blog.csdn.net/article/det…