使用 ThreadLocal 存储用户信息

由于目前的 web 应用,几乎都是线程多路复用,同一时间的用户请求都在独立的线程中。所以可以把用户信息存储在 ThreadLocal 中,减少引用对象的传递。

实现 UserContext

public class UserContext {

    private static final ThreadLocal<User> local = new ThreadLocal<User>();

    public static void set(User user){
        local.set(user);
    }

    public static User get(){
        return local.get();
    }

    public static void remove(){
        local.remove();
    }
}

获取授权信息并设置

拦截器中处理

var token = request.getHeader("Authorization");
var user = getUser(token);
UserContext.set(user);

清理数据

http 返回之前,移除用户数据

UserContext.remove();