• 相关软件
    >jsp 下实现防止重复在线,统计在线人数的办法 创建者:webmaster 更新时间:2005-05-30 22:35

    防止重复在线,统计在线人数通常由三种办法: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         {
                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                   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,


    cn.wst.common.onLine.OnLineUser
    相关文章
    本页查看次数: