我刚做了一个用jsp/servlet的小型系统,领导要求一定实现用户不能重复登录(不管是同一台电脑还是不同的电脑)?在网上搜了一上午,也没有找到能实现的方案,请各位高手一定要帮帮小弟啊!请给个实现方案(最好有实现的具体方法最好,呵呵)!再次拜谢各位!
谢谢谢谢谢谢(本人分值不够高啊,否则全给啊!)

解决方案 »

  1.   

    登陆后把用户名放application范围内,另一个用户登陆时先检查application是否存在此用户名,存在则不让登陆,退出的时候再清除一下。个人观点,仅供参考。
      

  2.   

    web程序都是短连接。所以用户关掉浏览器,或者就是用户死机了,网络断了...等等,服务器根本无法知道。如果这种情况,是否允许用户登录?
    我以前做的方法是,把登录用户记录起来,如果再次登陆,就把以前的那个登录用户踢出去。
      

  3.   

    session做,当用户登陆后就记到session里,登陆的时候判断,如果session.getAttribute("user")=你现在session中的用户,就报个session重复(即重复登陆),然后给他个连接让他重新登陆,点登陆的时候你再清一下session.
      

  4.   

    我怎么感觉无法实现啊?因为http协议本来就是个无状态协议
      

  5.   

    服务器端如何得到用户退出事件啊?
    ======================================
    说实在的是不太可能的,除非用户规规矩矩的点击你的注销连接,不知道csdn怎么做的,呵呵
      

  6.   

    你可以让他无论如和只打开一次就可以了用window.open("","XXXX");
      

  7.   

    非常感谢大家的帮助,由于项目要求紧,用户暂时没有这方面的要求,所以领导也就不要求了,暂时先缓一下,不过好像用“HttpSessionBindingListener”这个监听器能实现!不过本人还没有实验,以后成功后在贴出来共享啊!再次感谢大家!
      

  8.   

    session做,当用户登陆后就记到session里,登陆的时候判断,如果session.getAttribute("user")=你现在session中的用户,就报个session重复(即重复登陆),然后给他个连接让他重新登陆,点登陆的时候你再清一下session.
    ------------------------
    感觉这样就OK了吧,判断session的值,如果存在的话,必须T出另外一个这个才能登录,
    好像以前玩的那种网页江湖聊天室一样,意外退出的话,要把以前的T掉的。
      

  9.   

    个人觉得将登陆的用户和对应的SESSIONID写入到一个文件里面,当用户退出,不管是什么情况的退出,只要SESSIONID不存在了,就从文件里面清楚掉这个用户和其对应的SESSIONID。至于什么时候检查一次这个登陆信息文件,呵呵,那个就看你自己喜欢了。
      

  10.   

    同名用户的session只要有效,就不让他登录。至于session是否有效,可以在session内监听requestListener,如果在一定时间内没有request生成,就让session失效
      

  11.   

    关键问题是没法知道用户关闭IE.一个折衷方案,  记录已经登陆用户ID.
    如果ID相同, 则问他是不是把前一个用户踢掉.
      

  12.   

    在sessionListener的init里设置一个标记,在requestListener的requestInited()的方法里将这个标记置true,在requestDestroyed()里将其置false。在sessionAttributeListener的相关方法(具体的忘了,就是监听某个attribute值变了的方法)里,当标记为false时,开始计时,在某段时间内标记值没变回true,就让session失效。
    至于session失效与用户登录状态的衔接,大可用查询数据库的方法,当然数据库要有个字段例如IS_SESSION_ACTIVE,来表示某个用户的session是否有效。如果有效,就不让他登录。
      

  13.   

    保存和正常退出都容易记录,断见断网或死机等,就让session在30分钟内没响应就当是退出了。像上面说的,可以用http session监听。具体我也没做过。
      

  14.   

    哎~~~csdn里面好多这样的帖子啊~~~楼主 你随便搜索下就会搜出一大堆来~~
      

  15.   

    我们做的一个防止同一帐户同时登陆系统的限制:import javax.servlet.http.*;
    import java.util.*;
    import javax.servlet.http.HttpSession;
    import *.AccountModel;public class SessionListener implements HttpSessionListener{
        private static java.util.Hashtable hUserName = new Hashtable();
        public void sessionCreated(HttpSessionEvent se){
           System.out.println("Session Created.");
        }    public void sessionDestroyed(HttpSessionEvent se){
            hUserName.remove(se.getSession());
            System.out.println("Session Destroyed.");
        }
        /*
         * isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法
         * @param sUserName String-登录的用户名称
         * @return boolean-该用户是否已经登录过的标志
         */
        public synchronized static boolean isLogined(HttpSession session,String sUserName){
          boolean flag = false;
          if(hUserName.containsKey(sUserName)){
                     flag = true;
                     HttpSession vsession = (HttpSession)hUserName.get(sUserName);
                     try {
                       vsession.invalidate();
                     }
                     catch (Exception ex){}
                 }
          else{
              flag = false;
          }
          hUserName.remove(sUserName);
          hUserName.put(sUserName,session);
          return flag;
        }    public synchronized static boolean isOnline(HttpSession session){
            boolean flag = true;          AccountModel user = (AccountModel) session.getAttribute("USER");
              HttpSession vsession = (HttpSession) hUserName.get(user.getMemberId());
              if (session.getId().equals(vsession.getId())) {
                flag = true;
              } else {
                flag = false;
              }
              return flag;    }
    }通过在login的servlet或action中的登陆方法中调用该HttpSessionListener.isLogined()方法判断是否已经登陆了,如果已经登陆,则不让登陆(踢第一个还是后面的,自己决定).在web.xml中加入:
      <listener>
        <listener-class>*.SessionListener</listener-class>
      </listener>
    你可以试试.
      

  16.   

    原理是判断登陆名在服务器端是否有session,有的话就说明已经登陆了,否则就是没有登陆.
    可以满足楼主的需求.互连网任意机器都可以限制.我们系统测试没有问题楼主.既然不需要了就结帖吧!
      

  17.   

    1.数据库里面放一张表(onlineUser)记录用户id,用户名,最后登錄时间,sessionID(重要)
    2.用户登陆的时候先查看是否在这张表里有他的记录,如果有就是重复登陆,設置原來sessionID超時,更新表的sessionID,最后登錄时间等内容,如果没有就在数据库表中添加這種做法是
    登录后把当前登录的用户踢出去以前别人问的可以参考一下
    http://community.csdn.net/Expert/topic/5448/5448746.xml?temp=.8119928
      

  18.   

    看来你是个高手啊,对这类问题已经有了很好的认识与完美的解决方案了.
    不知道高手能给我解惑下下面几个问题不?
    1.放application中,结束浏览器进程或者断电如何清除,不要说什么监控session过期,我希望实时
    2.服务器集群时放application中有意义?
    3.数据库用一个字段来标识登录状态,同上面一样结束浏览器进程或者断电何时更改其数据库状态,不要说什么监控session过期,我希望实时