从请求中获取当前用户的三种方法

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


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值