日期:2014-05-17  浏览次数:20748 次

想用静态方法得到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中 这样就好了 不信你试试