gitee地址:https://gitee.com/langhai666/langhai-blog
github地址:https://github.com/Allenkuzma/langhaiblogs
本篇文章的完整代码请阅读上面 浪海博客 的源码。
cc.langhai.utils.UserContext (实现存储用户信息功能)
ThreadLocal能够提供线程隔离作用,所以在开发应用的时候,用户登录完成之后,可以将用户信息存储在ThreadLocal当中,方便我们后续获取用户相关信息。
private static ThreadLocal<User> userThread = new ThreadLocal<>();
public static void set(User user) {
userThread.set(user);
}
public static User get() {
return userThread.get();
}
在用户成功登录的时候,调用set()方法来将用户信息存储到ThreadLocal当中。在service需要用到用户信息直接调用get()方法获取。ThreadLocal类中使用最多的也是get()和set()方法。
// 存储用户信息
UserContext.set(user);
// 获取用户信息
User user = UserContext.get();
下面是get()方法的源码。返回此线程局部变量的当前线程副本中的值。
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
UserContext做成一个静态工具类,方便调用。
用户退出的时候调用remove()方法可以防止内存泄露。
public static void remove() {
userThread.remove();
}
上面已经提供大部分代码,具体实现细节可以参考 浪海博客 源码,或者根据逻辑自行实现。