`

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

阅读更多

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

4.session超时,session为null就表示下线了  通过统计session数量实现的。
思路是设定一个数组来记录用户数,在用户登录的时候,数组加一,注销的时候数组则减一。具体实现是用HttpSessionBindingListener来监听。但是这样做就出现了问题:用户不通过正常注销,比如说session超时,或者是关闭浏览器,这个时候session是失效了,但是数组中的记录还在,没有减少,这样就出现错误。关闭浏览器的话,是无法判断,你可以设置一个timeout时间,时间内没反映,等到了时间就触发方法--
.

分享到:
评论

相关推荐

    JSP中的在线人数统计

    本文将详细介绍如何在JSP(JavaServer Pages)环境中实现在线人数统计的功能。此功能主要依赖于J2EE平台提供的`HttpSession`机制以及`HttpSessionListener`监听器来完成。 #### 二、背景知识 1. **JSP与Servlet**...

    在线人数统计

    在线人数统计是网站运营中常见的需求,用于了解网站的实时活跃用户数量。在这个小型案例中,我们使用了Java Servlet中的`HttpSessionListener`和`HttpSessionBindingListener`接口来实现这一功能。以下是对这两个...

    jsp+sql2005+tomcat实现的新生报到管理系统原创

    2. **报到管理**:记录新生报到时间,更新报到状态,防止重复报到。 3. **宿舍分配**:根据新生信息进行宿舍分配,并将信息同步到系统中。 4. **班级管理**:根据专业划分班级,方便后续的教学安排。 5. **统计分析*...

    JSP_counter计数器

    **JSP Counter 计数器详解** 在Web开发中,我们常常需要跟踪并记录用户的访问量,例如在网站的首页...在实际项目中,计数器可能还需要考虑并发控制、防止重复计数等复杂问题,这些都需要根据具体需求来设计和优化。

    jsp体育成绩管理系统

    系统应具备防止重复报名的机制,并能记录每个班级的参赛人数和项目。 4. 成绩统计模块:系统的核心功能之一,负责收集、整理和分析比赛成绩。管理员可以录入比赛结果,系统自动计算班级和学生的总分、平均分等统计...

    JSP 流量管理系统

    **JSP 流量管理系统详解** ...总之,"JSP 流量管理系统"是一个集成了多种技术和概念的综合性项目,它的设计和实现涵盖了Web开发的多个重要领域,对于学习和理解JSP以及相关技术有着很高的参考价值。

    jsp开发的投票系统

    本投票系统采用JavaServer Pages(JSP)技术进行开发,这是一种基于Java的动态网页技术,能够方便地实现服务器端的业务逻辑处理。以下是关于该投票系统的详细介绍: 1. **JSP技术基础** JSP是Java平台上的Web开发...

    JSP+SQL田径运动会报名系统

    6. **数据统计与报表**:系统能自动生成各类报表,如报名人数统计、各项目报名情况分析等,帮助组织者更好地规划和管理运动会。 开发过程中,可能会涉及到MVC(Model-View-Controller)设计模式,将业务逻辑、数据...

    学生选课系统源代码

    本系统采用JSP(JavaServer Pages)技术和JavaBean组件来构建,旨在实现学生的在线选课、作业上传与下载等功能。下面,我们将深入探讨这些关键技术点以及它们在系统中的应用。 一、JSP技术 JSP是Java平台上的动态...

    第6章学生选课系统

    6. **数据展示模块**:系统应能以报表或图表的形式展示选课统计信息,如选课人数、课程热门度等,方便决策者分析。 7. **异常处理与日志记录**:系统需具备完善的错误处理机制,当出现异常时,能够给出友好的提示,...

    网上选课系统.zip

    4. **SQL操作**:为了与数据库交互,开发者需要熟练掌握SQL语言,包括CRUD(创建、读取、更新、删除)操作,以及复杂的查询语句,以满足系统的查询需求,如查找特定学生的选课情况或统计某课程的选课人数。...

    教务管理系统

    本系统采用Java语言开发,利用JSP技术实现前端界面与后端逻辑的交互。 **需求分析**主要包括以下几个方面: 1. **学生管理**:实现对学生基本信息(如姓名、学号、性别、所在班级等)的录入、更新、删除和查询等...

    2021-2022计算机二级等级考试试题及答案No.4135.docx

    例如,统计各个班各个分数段的人数,可以清楚地展示每个班级在不同分数范围内的学生分布情况。 ### 9. 数据库类型的划分依据 - **知识点概述**:层次型、网状型和关系型数据库的主要区别。 - **详细解释**:这三种...

Global site tag (gtag.js) - Google Analytics