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),当请求结束后就会进行清理