说明:LocalThread是线程变量,可以往该线程变量中填充我们项目用户的ID,可以在其他的业务代码中直接获取,十分方便,详细参考:http://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需要注意以下两点,不然会发生内存泄漏,详细参考:http://t.csdn.cn/3Z2Jf
(1)变量需要使用private static final修饰;
(2)需要记住调用LocalThread的remove()方法;
错误
如果发现在使用时,获取用户ID,结果为null
分析&解决:需要检查,在给用户发放Token时,有没有把用户的ID传入到Map中;