1. 程式人生 > >從請求中獲取當前使用者的三種方法

從請求中獲取當前使用者的三種方法

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 時才會執行。顧名思義,該方法將在整個請求結束之後,也就是在DispatcherServlet 渲染了對應的檢視之後執行。這個方法的主要作用是用於進行資源清理工作的。

只要返回preHandle返回true,就會執行UserThreadLocal.setUser(user),當請求結束後就會進行清理