防止重复在线,统计在线人数通常由三种办法:1.通过数据库的记录 2.使用ServletContext类型的application 3.采用session. 第一种做法较简单但会给数据库造成负担.第二种做法还没去实现.:) 本文实现了采用session的做法,基本思想就是正常登陆的时候建立一个session记录登陆名字,此时激发监听器。 代码如下: 1。登陆时假设登陆名loginINFO[0],建立session记录登陆名字。 if(rs_login.next()){            Login_servlet.logger.info("登陆验证成功");//log4j              OnLineUser OLU=new OnLineUser();//            if  (!OLU.existUser(loginINFO[0])){                 Login_servlet.logger.info("重复登陆");         return;                                       }else{                         session.setMaxInactiveInterval(3000); //session的生命周期                         session.setAttribute(loginINFO[0],OLU);                                                             }   2.监听器代码:OnLineUser /*  * 创建日期 2005-5-12  *  * 目的:  *   */ package cn.wst.common.onLine; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener;    import org.apache.log4j.Logger; import  java.util.*; /**  * @author wangshangting  *  * 目的:  * 用于统计在线人数,防止统一帐号登陆,退出取消账号  */ public  class OnLineUser implements HttpSessionBindingListener{   //    private static OnLineUser instance = null; //    synchronized public static OnLineUser getInstance()//singleton模式,确保只有一个OnLineUser实例 //    { //    if( instance == null ) //    { //        instance = new OnLineUser(); //    } //    return instance; //    }               static Logger logger = Logger.getLogger(OnLineUser.class.getName());     public  OnLineUser(){       }       private static Vector  users=new  Vector();  //静态变量!!!!!!!!!!!!     private int i=1;     public  int  getCount(){                      users.trimToSize();                    return  users.capacity();       }       public  boolean  existUser(String  userName){               users.trimToSize();               boolean  existUser=true;               for  (int  i=0;i<users.capacity();i++  )               {                       if  (userName.equals((String)users.get(i)))                       {                               existUser=false;                               OnLineUser.logger.info(users.get(i));                             OnLineUser.logger.info("重复");                             break;                       }               }               return  existUser;       }            public  boolean  deleteUser(String  userName)  {           OnLineUser.logger.info("移除开始!!");             users.trimToSize();                      if(!existUser(userName)){                       int  currUserIndex=-1;                       for(int  i=0;i<users.capacity();i++){                               if(userName.equals((String)users.get(i))){                   //                OnLineUser.logger.info("找到");                                     currUserIndex=i;                                       break;                               }                       }                       if  (currUserIndex!=-1){                            OnLineUser.logger.info("移除:"+currUserIndex);                             users.remove(currUserIndex);                               users.trimToSize();                               return  true;                       }                                    }               return  false;       }       public  Vector  getOnLineUser()       {               return  users;       }                public  void  valueBound(HttpSessionBindingEvent  e)  {               users.trimToSize();                            users.add(e.getName());                                            OnLineUser.logger.info(e.getName()+"\t      登入到系统\t"+(new  Date()));                       OnLineUser.logger.info("第"+i+"进入");                     i++;                               for(int i = 0;i < users.size();i++){                         OnLineUser.logger.info(""+i+":"+users.get(i));                     }                                        System.out.println("            在线用户数为:"+getCount());                                    }                             /**          *           */         public  void  valueUnbound(HttpSessionBindingEvent  e)  {               users.trimToSize();               String  userName=e.getName();               deleteUser(userName);              OnLineUser.logger.info(userName+"\t      退出系统\t"+(new  Date()));               OnLineUser.logger.info("            在线用户数为:"+getCount());           }   }  
  3. 要记得在web.xml的所有servlet之前生命 OnLineUser, <listener>  <listener-class>cn.wst.common.onLine.OnLineUser </listener-class>  </listener  
 
  |