在J2EE中怎样实现一个用户只能同时登陆一次?

解决方案 »

  1.   

    基本思路正确,但是需要增加超时时间。当过了超时时间就忽略标志。
    并在每一次访问重置超时时间。
    不要指望用户注销,10个用户9个忘记注销
    不要指望关闭用户窗口的事件,有人习惯拔网线。
    不要指望session的timeout事件,服务器也是需要重启的。
      

  2.   

    2楼说的就很清楚了关于如何知道退出的呢?一就是 用户注销,然后更新数据库,不过2楼说的很对,实际应用中,很少有人直接去点注销的。再就是 用户登录后可以把 用户名  放在session中,判断用户名是否还存在在session,如果没有,则说明退出了可能不是最好的办法也许你会问,session默认时间为30分钟,不能等30分钟吧,的确,这就需要根据实际需求 设计session时间为几分钟。
      

  3.   

    很对啊,如果这么说,就没有什么办法了啊,那就多保险啊,什么AJAX都用上啊,哈哈
      

  4.   

    创建一个线程,一分钟查询一次客户端时间戳。
    客户端也一分钟更新一次自己的时间戳。
    如果这两个时间相差超过2分钟以上,那么客户端肯定已经关闭了。new Thread(){
    public void run() {
    while(true){
    try {
    Thread.sleep(60000*1); //1分钟执行一次判断
    } catch (InterruptedException e) {}
    long t=System.currentTimeMillis();
    for (int i = 0;siteList!=null && i <siteList.size(); i++) {
    OnlineModel om = (OnlineModel)onlineList.get(i);
    long rt = om.getRefreshTime();
    if(t-rt>60000*3){//超过3分钟,认为客户端已经关闭。
    onlineList.remove(om);
    i--;
    }
    }
    }
    }
    }.start();
      

  5.   


    说法是没错,这种做法客户端需要内嵌iframe或者使用0高度的frame,在很多地方是禁止的。
      

  6.   

    忽然想起来,在websphere控制台还有一种方法。
    登录了时候通知已经有用户登录了。你可以把他踢了,或者放弃登录。
      

  7.   

    恩,11楼的方法应用很普遍,可以考虑,可以模仿QQ,msn的方式