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

本文介绍了一种利用session来统计在线人数并防止重复登录的方法。通过监听session的绑定事件,可以记录和跟踪在线用户的状态,有效避免同一账户的同时登录,确保系统的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值