從請求中獲取當前使用者的三種方法
1、在controller的方法中使用submit(Order order,@CookieValue(UserLoginInterceptor.TOKEN_NAME)String token)
然後通過token去sso系統去查詢使用者是否存在(sso系統會查詢redis)。
2、由於使用了使用了spring MVC的攔截器,在攔截器中就使用了token去查詢使用者並返回使用者了,所以沒必要在一次請求中二次使用一個方法。我們在攔截器中使用request.setAttribute("user", user);,並在controller中request.getAttribute("user")即可。
3、使用ThreadLocal。
public class UserThreadLocal {
private static final ThreadLocal<User> THREADLOCAL = new ThreadLocal<>();
private UserThreadLocal() {
}
public static void setUser(User user) {
THREADLOCAL.set(user);
}
public static User getUser() {
return THREADLOCAL.get();
}
因為一次請求都是一個執行緒。在攔截器的afterCompletion中使用
UserThreadLocal.setUser(null);// 重要:tomcat中使用的執行緒是可複用的執行緒,不是每次用完關閉的,所以一定要做清空操作。否則就會亂套。
後面當查詢出使用者後,再使用UserThreadLocal.setUser(user);// 相當於map,每次都會覆蓋。
為什麼要在afterCompletion中使用?
因為afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 方法,該方法也是需要當前對應的Interceptor
只要返回preHandle返回true,就會執行UserThreadLocal.setUser(user),當請求結束後就會進行清理