我們有時候會通過token進行多次查詢(豬:token是redis中的key),比如:
一次是在登錄攔截器中,一次是在controller的業務中查詢,這樣存在性能和資源的浪費問題!!!
那么如何將攔截器中的數據傳遞到Controller中呢?
有兩種方案:
1,將User對象放置到request對象中
2,使用ThreadLocal線程變量實現(在進入tomcat和產生響應前,對象都處於同一個線程中)
實現:
1,定義一個ThreadLocal相關的類
public class UserThreadLocal {
private static ThreadLocal<User> USER_LOCAL = new ThreadLocal<>();
//對外提供set和get方法
public static void setUser(User user){
USER_LOCAL.set(user);
}
public static User getUser(){
return USER_LOCAL.get();
}
}
2,在登陸攔截器中將User對象放置到ThreadLocal中
//查詢到用戶,將用戶放入到ThreadLocal中
UserThreadLocal.setUser(user);
3,在Service中可以通過ThreadLocal獲取User
//從ThreadLocal線程變量中獲取User對象
User user = UserThreadLocal.getUser();