本人的环境为tomcat5.5 ,开发语言为struts1.2+hibernate3.1,用户登录系统我们把用户的登录信息放到session中,
其中有一个信息登记的页面,有一个字段为用户名,由于用户信息已经在session中了,因此用户名不用在jsp页面录入,直接在action中,从session中取用户名,然而有时候会出现比如明明是用户B在做登记,会从session中取到用户A的信息,类似于线程不安全。用户信息是从session中取得,排除jsp页面缓存的问题。另外这种问题不是很稳定,不一定什么时候就会出现一次。不知道大家遇到过这种问题吗,如何解决这个问题?
其中有一个信息登记的页面,有一个字段为用户名,由于用户信息已经在session中了,因此用户名不用在jsp页面录入,直接在action中,从session中取用户名,然而有时候会出现比如明明是用户B在做登记,会从session中取到用户A的信息,类似于线程不安全。用户信息是从session中取得,排除jsp页面缓存的问题。另外这种问题不是很稳定,不一定什么时候就会出现一次。不知道大家遇到过这种问题吗,如何解决这个问题?
这就有可能是你自己的类没有考虑到线程安全。
比如,你在Action中设置的值,被另一个用户调用同一个Action的时候覆盖了。猜测如上,你可以在后台加打印看一下是不是有这种问题。
再看看你保存到session中的对象是不是有问题
好像是在同一台机器登录两个用户,然后刷新一个用户的页面就会出现session混乱的情况。搞不清楚是服务器端的问题还是浏览器端的问题。
我后来也用了一个比较麻烦的方法处理,就是将用户登陆后的sessionid当做参数向其他页面传递,然后在比较这个传递过来的 参数和获取到的sessionid比较,如果不同了,就禁止操作。这也不是个解决办法。
was5有这样的问题,是was5本身的bug,打了was5的补丁后就没出现过。
---------------------------------
解开权限与业务耦合,提高开发效率
细粒度权限管理软件 试用版下载
http://www.metadmin.com
在同一个浏览器的多页签登陆,
这样会把前一个session给缓冲掉的,
这样的话你登陆一个用户了,重新开一个浏览器再登陆就没问题了
参考这个代码:Configuration con = new configuration();
SessionFactory factory = con.buildFactory();
ThreadLocal tl = new ThreadLocal();public session getSession(){
session s = (Session)tl.get();
if(s==null){
s = factory.openSession();
tl.set(s);
}
return s;
}这样就可以确保不同的用户线程有不同的Session了