我是这样做的。每个用户登录站点都有一个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中 这样就好了 不信你试试