用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字

feng    -  云代码空间

——

JSP实现防止重复在线,统计在线人数的办法

2012-12-13|1734阅||

摘要:防止重复在线,统计在线人数通常由三种办法:} 1.通过数据库的记录 2.使用ServletContext类型的application 3.采用session. 第一种做法较简单但会给数据库造成负担.第二种做法还没去实现.:) 本文实现了采用session

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

顶 10踩 4收藏
文章评论
    发表评论

    个人资料

    • 昵称: feng
    • 等级: 资深程序员
    • 积分: 1584
    • 代码: 8 个
    • 文章: 42 篇
    • 随想: 2 条
    • 访问: 84 次
    • 关注

    站长推荐