本人的环境为tomcat5.5 ,开发语言为struts1.2+hibernate3.1,用户登录系统我们把用户的登录信息放到session中,
其中有一个信息登记的页面,有一个字段为用户名,由于用户信息已经在session中了,因此用户名不用在jsp页面录入,直接在action中,从session中取用户名,然而有时候会出现比如明明是用户B在做登记,会从session中取到用户A的信息,类似于线程不安全。用户信息是从session中取得,排除jsp页面缓存的问题。另外这种问题不是很稳定,不一定什么时候就会出现一次。不知道大家遇到过这种问题吗,如何解决这个问题?

解决方案 »

  1.   

    你确定session 在set数据的时候没有问题?
      

  2.   

    直接在action中,从session中取用户名根据你这句话,可见你在Action中有处理过程,再加上你用的struts1.2
    这就有可能是你自己的类没有考虑到线程安全。
    比如,你在Action中设置的值,被另一个用户调用同一个Action的时候覆盖了。猜测如上,你可以在后台加打印看一下是不是有这种问题。
      

  3.   

    我遇到过类似问题,当时用的是wasce2.0.11,整合的是tomcat6.0.13,用户比较多,后来发现数据串了的问题,利用日志监控了一段时间,发现是 sessionid重复了。如A用户在8:00登陆,B用户8:05分登陆,结果他们的sessionid相同,结果8:05分以后A用户实际上是使用B的身份在操作。我当时的程序可以不使用session,就把sesssion都去掉了,完全利用http参数传递状态,但是你这个好像这么解决不可能,只能自己写一个tomcat的session生成算法了。
      

  4.   

    先看看两个session的id是否相同,理论上肯定是不同的。
    再看看你保存到session中的对象是不是有问题
      

  5.   

    我也遇到过这样的问题,另外这种问题不是很稳定,不一定什么时候就会出现一次
    好像是在同一台机器登录两个用户,然后刷新一个用户的页面就会出现session混乱的情况。搞不清楚是服务器端的问题还是浏览器端的问题。
      

  6.   


    我后来也用了一个比较麻烦的方法处理,就是将用户登陆后的sessionid当做参数向其他页面传递,然后在比较这个传递过来的 参数和获取到的sessionid比较,如果不同了,就禁止操作。这也不是个解决办法。
    was5有这样的问题,是was5本身的bug,打了was5的补丁后就没出现过。
      

  7.   

         看看你的session id 是否一样,存的时候一个 id 对应一个session 这样就不会存在你说的那个问题了,
      

  8.   

    struts1.2的action是单例的,所以是线程不安全的,是否在action中有类属性的存在,如果存在那么需要注意并发问题
      

  9.   

    线程不安全的,最好不用线程,每个个用户记录cookie在自己客户端这样实现好
      

  10.   

    这个问题不难解决,在用户退出时,把session 也清空,其他用户登录就不会出现前一个用户的信息
      

  11.   

    呵呵, 不清空也没有多大问题。因为,既然在登录的时候,已经显示的set了。session不会有什么问题的,应该是你代码里面使用session不当。
    ---------------------------------
    解开权限与业务耦合,提高开发效率
    细粒度权限管理软件 试用版下载
    http://www.metadmin.com
      

  12.   

    呵呵,不知道是不是你登陆浏览器的问题,
    在同一个浏览器的多页签登陆,
    这样会把前一个session给缓冲掉的,
    这样的话你登陆一个用户了,重新开一个浏览器再登陆就没问题了
      

  13.   

    应该是b取到了a的session id,因为session id是存在cookie中的,所以当不同的用户使用了同一session后,后者会将前者的session覆盖。当前者再次使用Session时,session id就会不是原来存的,所以发生错误。
    参考这个代码: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了