由于目前的 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();