java 页面在线访问人数统计和在线登录人数统计 (2012-03-22 15:20:42)转载▼
标签: java 页面访问人数 在线登录人数 session 监听 it 在线人数统
OnlineSessionListener监听器(实现HttpSessionListener)接口来实现页面在线访问人数统计,当有用户访问到页面就会创建一个session,此时会触发public void sessionCreated(HttpSessionEvent se)方法,如果session失效,此时会触发public void sessionDestroyed(HttpSessionEvent se)方法。在此方法里我们用OnlineList进行在线访问人数的统计
public class OnlineList {
private static final OnlineList onlineList = new OnlineList();
private int maxSession;
private int activeSession;
private OnlineList()
{
//v = new Vector();
}
public static OnlineList getInstance()
{
return onlineList;
}
public void addSession(){
activeSession++;
if(activeSession>=maxSession){
maxSession=activeSession;
}
}
public void delSession(){
if(activeSession > 0)
activeSession--;
}
public int getActiveSession(){
return activeSession;
}
public int getmaxSession(){
return maxSession;
}
}
public class OnlineSessionListener implements HttpSessionListener {
private OnlineList ol = OnlineList.getInstance();
public void sessionCreated(HttpSessionEvent arg0) {
ol.addSession();
}
public void sessionDestroyed(HttpSessionEvent arg0) {
ol.delSession();
}
}
用UserListener监听器(实现HttpSessionAttributeListener接口)来实现在线登录人数统计,当有用户添加到session中,监听器就调用public void valueBound(HttpSessionBindingEvent event)方法。如果有用户退出系统,监听器就调用public void valueUnbound(HttpSessionBindingEvent event)方法。我们用UserList来统计用户信息
在UserList这个类的设计上,我们应用了单例(Singleton)设计模式,关于设计模式的知识,读者可以参看相关的书籍。UserList是一个单例类,所谓单例类,是指一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例类的一个最重要的特点是类的构造方法是私有的,从而避免了外部利用该类的构造方法直接创建多个实例。在代码的第8行,定义一个静态的常量userList,它表示了UserList类的一个对象。在UserList类加载的时候,这个对象就产生了。第11~14行,声明UserList类的构造方法为private,这是为了避免在外部使用UserList类的构造方法创建其对象。要注意的是,如果在类中不写构造方法,那么Java编译器就会为这个类提供一个默认的不带参数的公开的构造方法,这样,在外部就可以通过类的构造方法创建对象了,那么UserList也就不再是一个单例类了。既然UserList类的构造方法是私有的,那么在外部就不能用new去构造对象,于是在代码的第16~19行,定义了一个静态的方法getInstance(),在这个方法中,返回在类加载时创建的UserList类的对象。因为getInstance()方法本身是静态的,所以可以直接通过类名来调用。
那么为什么要将UserList设计成单例类呢?这是因为UserList类的对象是用于存储和获取在线用户的列表,而这个用户列表对于所有的页面来说都应该是同一个,所以将UserList类设计成单例类,这样,所有的类访问的就是同一个UserList对象了。
代码的第9行,定义了一个私有的Vector类型的变量,在UserList类的构造方法中,对Vector类型的变量v进行了初始化,用于存放String类型的对象。注意,在这个地方没有使用ArrayList,是考虑到UserList对象可能会被多个线程同时访问,因为ArrayList不是同步的,而Vector是同步的,所以采用Vector来保存用户列表。
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class UserListener implements HttpSessionAttributeListener {
//用户登录身份证
private String USERNAME;
private UserList u1 = UserList.getInstance();
//判断用户是否存在
public boolean IsExist(String sfz)throws Exception
{
try
{
return u1.IsExist(sfz);
}
catch(Exception ex)
{
ex.printStackTrace();
return false;
}
}
public String getUSERNAME() {
return USERNAME;
}
public void setUSERNAME(String username) {
USERNAME = username;
}
public void attributeAdded(HttpSessionBindingEvent event) {
try{
if("USERNAME".equals(event.getName())){
u1.addUser((String)event.getValue());
}
}catch(Exception e){
e.printStackTrace();
}
}
public void attributeRemoved(HttpSessionBindingEvent event) {
try{
if("USERNAME".equals(event.getName())){
u1.RemoveUser((String)event.getValue());
}
}catch(Exception e){
e.printStackTrace();
}
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
}
}
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;
public class UserList {
private static final UserList userList = new UserList();
private Vector v = new Vector();
private int maxUser;
private UserList()
{
//v = new Vector();
}
public static UserList getInstance()
{
return userList;
}
//将用户登陆身份证保存到Vector中
public void addUser(String sfz) throws Exception
{
try{
if ( sfz != null&&!"".equals(sfz))
{
if ( v.indexOf(sfz) >= 0)//判断是否已经存在
return ;
//可能的操作
//添加登录ID
v.addElement(sfz);
if(getUserCount()>maxUser){
maxUser=getUserCount();
}
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
finally{
}
}
public boolean IsExist(String sfz)throws Exception
{
try{
if ( v.indexOf(sfz) >= 0)
return true;
return false;
}
catch(Exception ex)
{
ex.printStackTrace();
return false;
}
}
//删除用户登录ID
public void RemoveUser(String sfz)throws Exception
{
try{
if ( sfz != null&&!"".equals(sfz) )
{
//修改数据库
//移除用户登录ID
v.removeElement(sfz);
}
}
catch(Exception ex)
{
ex.printStackTrace(); //写日志
}
finally{
}
}
//返回Vector枚举
public Enumeration getUserList()
{
return v.elements();
}
//返回迭代器
public Iterator getUserListItera(){
return v.iterator();
}
//返回在线人数
public int getUserCount()
{
return v.size();
}
//返回在线人数峰值
public int getMaxUser(){
return maxUser;
}
}
最后在web-xml里 加入如下信息
<listener>
<listener-class>
com.myxmu.listener.UserListener
</listener-class>
</listener>
在线人数统计程序存在一些问题,如果用户没有退出登录而直接关闭了浏览器,那么在服务器端的Session中,这个用户仍然是存在的,直到Session的超时值发生。所以在线人数统计只能做到在一个时间段内统计出大致的在线人数,而不能统计出精确的人数。为了提高统计的精确性,可以在客户端设置脚本,当浏览器关闭时,自动向服务器发送一个请求,服务器收到这个请求后,使Session失效。不过,这也不能做到100%的精确,因为还存在着客户端的浏览器异常终止,或者客户机器崩溃的可能。
分享到:
相关推荐
《Java学生宿舍管理系统详解》 Java学生宿舍管理系统是一款基于Java技术开发的应用软件,旨在帮助学校管理部门有效管理和优化学生住宿情况。系统集成了数据库管理、用户交互界面和一系列管理功能,适用于各类高等...
5. 登录与权限管理:系统可能包含登录界面,使用JPasswordField处理密码输入,实现不同用户角色(如管理员、教师、学生)的权限控制,限制访问特定功能。 6. 文件导入导出:支持CSV或XML格式的学生数据导入导出,...
在Java Web开发中,统计在线人数是一项常见的需求,它能够帮助我们了解系统当前的活跃用户量。本项目通过实现`HttpSessionListener`接口,每隔一分钟动态更新在线人数,提供了高效且可靠的解决方案。以下是对这个...
《Java学生宿舍管理系统详解》 Java学生宿舍管理系统是一款利用Java编程语言和SQL数据库技术构建的应用软件,主要用于高校或教育机构对学生宿舍的全方位管理。系统涵盖了来访登记、夜归记录、新生入住等一系列日常...
网站访问量通常通过记录每个独立访客的请求来计算。在线人数则是指在特定时间范围内(例如,5分钟或10分钟)活动的用户数量。为了实现这个功能,我们可以利用以下技术: 1. **会话管理**:Java中的HttpSession接口...
【Java 学校宿舍管理系统源代码】是一款基于Java技术和MySQL数据库设计的校园信息化管理软件,主要功能涵盖了系统管理员、宿舍管理员以及学生的登录管理和多种管理模块。这个系统旨在提高学校后勤管理效率,确保宿舍...
访客登记管理(找人的姓名,学院,人数,身份证,来访人时间,电话,时间,事由等) 来访人数统计(饼状图,某个学院来访人统计) 家庭人员来访审核 家庭来访人员登记,离开管理(审核通过的可以登记) 学生 个人...
Java教学任务管理信息系统源码是一套完整的教学管理解决方案,它基于Java编程语言,利用其强大的面向对象特性和跨平台优势,为教育机构提供了一个高效、便捷的任务分配与管理平台。这个系统涵盖了教师、学生以及管理...
Java学生成绩管理系统是一款基于Java技术开发的教育管理软件,主要功能涵盖了学生分数的日常管理,包括添加、删除、修改和查询操作。该系统还具备高级功能,如计算各科目的平均分,以及通过饼图和条形图展示数据,...
《Java版住院管理系统详解》 Java版住院管理系统是一款基于Java和JSP技术开发的应用软件,主要服务于医疗机构,用于高效管理住院病人的各项信息和服务流程。本文将深入探讨该系统的关键技术和实现原理,以及其在...
Java Web在线人数统计是Web应用程序中常见的需求,用于获取当前网站活跃用户数量。这个功能的实现通常基于HTTP协议的工作机制,特别是对Session的管理和监听。本文将深入探讨如何使用Java Web技术来监听并统计在线...
Java Swing学生管理系统是一款基于Java GUI库Swing开发的软件,主要用于高校或教育机构对学生信息进行高效、便捷的管理。此系统结合了Java的 JDBC(Java Database Connectivity)技术,能够与数据库进行交互,实现...
《基于Java的人事档案管理系统详解》 在信息技术领域,开发管理系统的目的是为了高效地处理各类数据,提升工作效率。本文将详细解析一个使用Java语言编写的人事档案管理系统,该系统采用Access数据库作为数据存储,...
2. **数据存储**:通常,系统会利用关系型数据库如MySQL或Oracle来存储学生信息,通过JDBC(Java Database Connectivity)接口进行数据访问和操作。 3. **图形用户界面**:采用Java Swing或JavaFX库来设计用户友好...
- **宿舍管理**:管理宿舍的基本信息,如宿舍号、容纳人数、位置等。 - **宿舍分配**:根据学生需求和宿舍空闲状况,进行宿舍分配,并记录分配信息。 - **查询功能**:提供多种查询方式,如按学生姓名、学号查找...
《高考信息管理系统设计与实现——基于Java和SQL》 高考信息管理系统是一款专为教育管理部门设计的软件工具,用于高效、准确地管理高考相关的各种信息。本系统的核心是结合了Java编程语言和SQL数据库技术,实现了...
Java学生信息管理系统是一种基于Java编程语言开发的应用程序,主要用于存储、管理和检索学生的各种信息。在这个系统中,登录界面是用户与系统交互的第一步,而连接Access数据库则为系统提供了数据存储的能力。Access...
### Java课程设计:学生成绩管理系统 #### 一、项目背景与目标 在教育领域,学生成绩管理是一项重要的工作,涉及到学生的学业评估、奖学金评定、毕业资格审查等多个方面。传统的手动记录和管理成绩的方式效率低下...
"Java活动报名管理系统答辩PPT" 本文研究的目标是基于微信小程序开发的一款大学生活动报名管理系统,重要内容是基于微信小程序实现大学生管理者对各式各样活动的创建、发布、管理,大学生用户群体报名活动的功能。...
《Java实现的学生成绩管理系统详解》 在IT领域,尤其是在教育信息化进程中,学生成绩管理系统扮演着至关重要的角色。本系统是用Java语言编写的,具有查询与统计功能,能够高效地处理和分析学生们的学业成绩。接下来...