线程变量ThreadLocal的使用

我们有时候会通过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();

 

转载于:https://www.cnblogs.com/lizhaowen/p/5934208.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值