静态方法中threadlocal处理session中存储的值

本文探讨了使用ThreadLocal存储Session信息的常见问题。作者尝试通过ThreadLocal实现跨请求获取Session中的用户信息,但在实践中发现该方法不可靠。文章提供了两种解决方案:一是确保每次请求都更新ThreadLocal;二是建议在Filter中统一处理Session信息的读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“想用静态方法得到session中保存的用户信息,用到了ThreadLocal,有点疑问解决思路”:
关键词:想用 静态 方法 得到 session 中 保存 用户 信息 用 到了 threadlocal 有点 疑问 解决 思路
想用静态方法得到session中保存的用户信息,用到了threadlocal,有点疑问?
我是这样做的。每个用户登录站点都有一个session ,我把用户权限信息保存到session中,同时用threadlocal也保存了,代码如下
java code

public class myuser{
private static userinfo info;

private static threadlocal threadlocal = new threadlocal();

public myuser()throws exception
{
}
public static userinfo getinfo()  {
    object obj = threadlocal.get();
         return (userinfo )obj;
}
 public static void setuserinfo (userinfo u) {
    threadlocal.set(u);
}

}

用threadlocal主要是觉得可以用静态方法得到用户信息,很方便,
但问题是。我用myuser.getuserinfo 有时可以得到,有时却得到null。 很不确定。10次大概有5次得到null 。很郁闷阿。是不是我哪里写错了

——解决方案——————–
同一个客户对你的请求虽然是同一个session,但似乎不是同一个线程吧。
threadlocal是解决保证同一个线程获取的是相同的本地数据,它存储的key是线程的唯一标识。一般来说在同一次客户请求中可以应用,或者在cs结构的应用中可以应用。
多个http请求之间是垮了多个线程的,所以不能这样用。

如果你非得用,可以这样,把request放在线程本地变量中,然后用request.getsession来获取session,这样的话对于同一个客户,不管是不是同一个request,他们获得的session是同一个。
——解决方案——————–
threadlocal 是对当前线程的,所以开启一个线程都要设置session的值进入threadlocal中
解决办法是这样 你做一个filter 然后对/*进行过滤 在dofilter 中 首先从session中获取值 接着set到threadlocal中 这样就好了 不信你试试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值