同一个用户帐号,在同一时间内只能一个人使用。

来源:互联网 发布:国外免费网络硬盘 编辑:程序博客网 时间:2024/05/16 05:00

发现对于登录问题的解决都说用session监听,但是没有人写出示例代码,今天写了一个,希望对大家有所帮助.  
  解决同名用户登录的问题,类似QQ,即同名用户第二次登录,第一次登录的用户就掉线.  
  SessionListener.java监听session的类,部署于/App/WEB-INF/classes/com/test下(其中App为你的应用程序目录)  
  package   com.test;  
  import   javax.servlet.http.*;  
  import   java.util.*;  
   
  public   class   SessionListener   implements   HttpSessionListener{  
          private   static   HashMap   hUserName   =   new   HashMap();//保存sessionID和username的映射  
          /**以下是实现HttpSessionListener中的方法**/  
          public   void   sessionCreated(HttpSessionEvent   se){  
          }  
           
          public   void   sessionDestroyed(HttpSessionEvent   se){  
                  hUserName.remove(   se.getSession().getId()   );  
          }  
          /*  
            *   isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法  
            *   @param   sUserName   String-登录的用户名称  
            *   @return   boolean-该用户是否已经登录过的标志  
            */  
          public   static   boolean   isAlreadyEnter(HttpSession   session,String   sUserName){  
                  boolean   flag   =   false;  
                  if(hUserName.containsValue(sUserName)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hUserName中)  
                          flag   =   true;  
                          //遍历原来的hUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)  
                          Iterator   iter   =   hUserName.entrySet().iterator();  
                          while   (iter.hasNext())   {  
                                  Map.Entry   entry   =   (Map.Entry)iter.next();  
                                  Object   key   =   entry.getKey();  
                                  Object   val   =   entry.getValue();  
                                  if(   (   (String)val   ).equals(sUserName)   ){  
                                          hUserName.remove(key);  
                                  }  
                          }  
                          hUserName.put(   session.getId(),sUserName   );//添加现在的sessionID和username  
                          System.out.println("hUserName   =   "   +   hUserName);  
                  }  
                  else{//如果该用户没登录过,直接添加现在的sessionID和username  
                          flag   =   false;  
                          hUserName.put(   session.getId(),sUserName   );  
                          System.out.println("hUserName   =   "   +   hUserName);  
                  }  
                  return   flag;  
          }  
          /*  
            *   isOnline-用于判断用户是否在线  
            *   @param   session   HttpSession-登录的用户名称  
            *   @return   boolean-该用户是否在线的标志  
            */  
          public   static   boolean   isOnline(HttpSession   session){  
                  boolean   flag   =   true;  
                  if(   hUserName.containsKey(   session.getId()   )   ){  
                          flag   =   true;  
                  }  
                  else{  
                          flag   =   false;  
                  }  
                  return   flag;  
          }  
  }  
   
  web.xml部署于/App/WEB-INF下  
  <?xml   version="1.0"   encoding="ISO-8859-1"?>  
   
  <!DOCTYPE   web-app  
  PUBLIC   "-//Sun   Microsystems,   Inc.//DTD   Web   Application   2.3//EN"  
  "http://java.sun.com/j2ee/dtds/web-app_2.3.dtd">  
   
  <web-app>  
   
  <listener>  
  <listener-class>  
  com.inspirer.dbmp.SessionListener  
  </listener-class>  
  </listener>  
   
  </web-app>  
  应用部分  
  1.在你的登录验证时,调用SessionListener.isAlreadyEnter(session,"admin")  
  既可以判断该用户名的用户是否登录过,又可以使上次登录的用户掉线  
  2.其他页面调用SessionListener.isOnline(session),可以判断该用户是否在线.  
   
 


 这里的讨论很热烈,不过首先得澄清,这个问题不叫单点登陆,呵呵,单点登陆指的是sso,感兴趣的朋友可以看看josso。  
   
 

原创粉丝点击