`
huttoncs
  • 浏览: 200909 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在线用户统计

    博客分类:
  • java
 
阅读更多
下面的代码是我在学习listener时从书中看到的,在这里把它贴出来和正在学习的同学分享一下

运行效果见图片。
1、运行结果中所收集的数据都是有Listener收集的,这里把所有的数据都存放在这个OnlineConstants类的静态常量中。OnlineConstants类的代码如下:
package ssh.constants;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpSession;

public class OnlineConstants {
//索引所有的Session
public static Map<String, HttpSession> SESSION_MAP =
new HashMap<String, HttpSession>();

//当前登录的用户总数
public static int CURRENT_LOGIN_COUNT = 0;

//历史访问总数
public static int TOTAL_HISTORY_COUNT = 0;

//服务器启动时间
    public static Date START_DATE = new Date();
   
    //最高在线时间
    public static Date MAX_ONLINE_COUNT_DATE = new Date();
   
  //最高在线人数
public static int MAX_ONLINE__COUNT = 0;
}

2、在这个实例中一共使用了4种Listener:ServletContextListener、HttpSessionListener,HttpSessionAttributeListener、ServletRequestListener,各自的功能这里就不提了,直接贴代码了
package ssh.listeners.onlineStatistics;

import java.util.Date;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import ssh.constants.OnlineConstants;

public class MyContextListener implements ServletContextListener{

public void contextInitialized(ServletContextEvent event) {
// 服务器启动时调用
OnlineConstants.START_DATE = new Date(); //记录启动时间
}

public void contextDestroyed(ServletContextEvent event) {
// 服务器销毁时调用
OnlineConstants.START_DATE = null; //清空结果
OnlineConstants.MAX_ONLINE_COUNT_DATE = null;
}

}


package ssh.listeners.onlineStatistics;

import java.util.Date;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import ssh.constants.OnlineConstants;

public class MySessionListener implements HttpSessionListener,HttpSessionAttributeListener{

    public void sessionCreated(HttpSessionEvent event) {
//创建Session 时被调用
HttpSession session = event.getSession(); //新创建的Session
OnlineConstants.SESSION_MAP.put(session.getId(), session);
//保存session
OnlineConstants.TOTAL_HISTORY_COUNT++; //总房访问人数++
OnlineConstants.CURRENT_LOGIN_COUNT++;
//如果当前在线人数超过历史记录,更新最大在线数
if (OnlineConstants.SESSION_MAP.size()>OnlineConstants.TOTAL_HISTORY_COUNT) {
OnlineConstants.MAX_ONLINE__COUNT = OnlineConstants.SESSION_MAP.size();
OnlineConstants.MAX_ONLINE_COUNT_DATE = new Date();
}
}

public void sessionDestroyed(HttpSessionEvent event) {
//销毁Session前被调用
HttpSession session = event.getSession(); //即将被销毁的session
OnlineConstants.SESSION_MAP.remove(session.getId());//移除session记录
OnlineConstants.MAX_ONLINE__COUNT--;

}

public void attributeAdded(HttpSessionBindingEvent event) {
// 添加session时调用
String name = event.getName(); //新建属性名
if (name.equals("seStudent")) { //登录
//当前登录数++
OnlineConstants.CURRENT_LOGIN_COUNT++;
OnlineConstants.MAX_ONLINE__COUNT++;
HttpSession session = event.getSession(); //添加到session

//查找该账号有没有在其他机器上登录
for (HttpSession sess:OnlineConstants.SESSION_MAP.values()) {
if (event.getValue().equals(sess.getAttribute("seStudent"))
&& session.getId()!=sess.getId()) {
sess.invalidate(); //使session失效
}
}
}
}

public void attributeRemoved(HttpSessionBindingEvent event) {
// 删除属性时调用
String name = event.getName(); //被删除的属性名
if (name.equals("seStudent")) {
OnlineConstants.CURRENT_LOGIN_COUNT--; //当前登录用户数--;
OnlineConstants.MAX_ONLINE__COUNT--;
}

}

public void attributeReplaced(HttpSessionBindingEvent event) {
// 修改属性时调用
String name = event.getName(); //被修改的属性名
if (name.equals("seStudent")) {
HttpSession session = event.getSession();
//重新登录的session
for (HttpSession sess:OnlineConstants.SESSION_MAP.values()) {
//如果新账号在其他机器上登录过,将以前的登录失效
if (event.getValue().equals(sess.getAttribute("seStudent"))
&& session.getId()!=sess.getId()) {
sess.invalidate(); //使session失效
}
}

}

}

}


package ssh.listeners.onlineStatistics;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class MyRequestListener implements ServletRequestListener{

public void requestDestroyed(ServletRequestEvent event) {
// TODO Auto-generated method stub

}

public void requestInitialized(ServletRequestEvent event) {
// 创建request时调用
HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
HttpSession session = request.getSession(true); //获取对应的session
session.setAttribute("ip", request.getRemoteAddr()); //记录ip地址

String uri = request.getRequestURI(); //访问的URL
String[] suffix = {".html",".action",".jsp",".do"}; //指定后缀

for (int i = 0; i < suffix.length; i++) {
if (uri.endsWith(suffix[i])) {//如果是指定后缀
break;   //继续运行
}
if (i == suffix.length-1) {
return;   //否则返回
}
}

Integer activeTimes = (Integer) session.getAttribute("activeTimes");
if (activeTimes == null) {
activeTimes = 0;
}

session.setAttribute("activeTimes", activeTimes+1);
}


}


3、把上面3个Listener配置到web.xml中,代码如下:
<!-- 在线登录统计start -->
<listener>
<listener-class>
ssh.listeners.onlineStatistics.MyContextListener
</listener-class>
</listener>
<listener>
<listener-class>
ssh.listeners.onlineStatistics.MySessionListener
</listener-class>
</listener>
<listener>
<listener-class>
ssh.listeners.onlineStatistics.MyRequestListener
</listener-class>
</listener>
<!-- 在线登录统计end -->


4、这里使用jsp页面显示记录在OnlineConstants的数据,代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@page import="org.apache.poi.ss.usermodel.DataFormat"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="nt" tagdir="/WEB-INF/tags"%>
<jsp:directive.page   import="ssh.constants.OnlineConstants" />
<jsp:directive.page   import="java.util.Date" />
<jsp:directive.page   import="java.text.DateFormat" />
<jsp:directive.page   import="model.login.LoginVo" />

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>在线登录统计</title>
</head>

<body>
服务器启动时间:
<%=DateFormat.getDateInstance().format(OnlineConstants.START_DATE) %>,
累积共接待过 <%= OnlineConstants.TOTAL_HISTORY_COUNT %> 访客。<br />
同时在线人数最多为 <%=OnlineConstants.MAX_ONLINE__COUNT %> 人,
发生在 <%=DateFormat.getDateInstance().format(OnlineConstants.MAX_ONLINE_COUNT_DATE) %>。<br />

目前在线总数: <%=OnlineConstants.SESSION_MAP.size() %>,
登录用户: <%=OnlineConstants.CURRENT_LOGIN_COUNT %>。<br />

<table border="1">
<tr>
<th>jsessionid</th>
<th>account</th>
<th>creationTime</th>
<th>lastAccessedTime</th>
<th>new</th>
<th>activeTimes</th>
<th>ip</th>
</tr>
<%
for (String id:OnlineConstants.SESSION_MAP.keySet()){
HttpSession sess = OnlineConstants.SESSION_MAP.get(id);
LoginVo loginVo = (LoginVo)sess.getAttribute("seStudent");
%>
<tr <%= session == sess? "bgcolor=#DDDDDD":"" %>>
<td><%=id %></td>
<td><%=loginVo==null ? "&nbsp;":loginVo.getStuName() %></td>
<td><%=DateFormat.getDateInstance().format(sess.getCreationTime()) %></td>
<td><%=DateFormat.getDateInstance().format(sess.getLastAccessedTime()) %></td>
<td><%=sess.isNew() %></td>
<td><%=sess.getAttribute("activeTimes") %></td>
<td><%=sess.getAttribute("ip") %></td>
</tr>
<%
}
%>
</table>

</body>
</html>


5、工程启动后直接访问该jsp页面即可,不涉及到任何的逻辑处理,这也是使用Listener的好处
  • 大小: 36.4 KB
分享到:
评论

相关推荐

    JAVA Web在线用户统计

    在JAVA Web开发中,实现在线用户统计是一项关键功能,它能够帮助网站或应用程序的管理员实时了解当前有多少用户正在访问和使用系统。这个“JAVA Web在线用户统计”解决方案显然是强大、好用且简单的,这意味着它可能...

    jsp实现在线人数及在线用户统计

    ### JSP实现在线人数及在线用户统计 #### 知识点概述 在现代Web开发中,统计在线人数和在线用户是十分重要的功能之一,尤其是在构建社区、论坛等交互性强的网站时。通过JSP(JavaServer Pages)可以方便地实现这一...

    jsp中监听器实现在线用户统计

    在"jsp中监听器实现在线用户统计"这个场景下,我们需要关注的是如何利用监听器来跟踪和管理在线用户。 首先,我们要理解Servlet监听器的概念。Servlet监听器是实现了Java Servlet API中特定接口的Java类,这些接口...

    .net C# 通过session控制重复登录及在线用户统计

    2. **在线用户统计**: 统计在线用户数量通常涉及到以下几个步骤: - **记录登录状态**:每当用户成功登录时,增加在线用户计数器,并将用户添加到在线用户列表中。可以创建一个全局变量或使用数据库来记录这个...

    基于Session的在线用户统计实现

    在ASP.NET开发中,"基于Session的在线用户统计实现"是一个常见的需求,它涉及到网站的用户行为分析和服务器资源管理。下面将详细讲解这个主题,以及相关文件在实现过程中的作用。 1. **Session概念与原理** ...

    JSP中基于Session的在线用户统计分析

    在JSP中,基于Session的在线用户统计分析是一种常见的用户管理技术,用于追踪并记录当前正在网站上活动的用户。Session是Web应用中用来跟踪用户状态的一种机制,它允许服务器端存储特定用户会话的数据,即使用户在...

    Afritxia在线用户统计、在线编辑器、验证码图片

    标题中的“Afritxia在线用户统计、在线编辑器、验证码图片”揭示了三个主要的IT技术领域:用户行为分析、富文本编辑工具以及安全验证机制。让我们深入探讨这些主题。 一、在线用户统计 在线用户统计是网站或应用...

    Afritxia在线用户统计、在线编辑器、验证码图片_webtest.zip

    "Afritxia在线用户统计、在线编辑器、验证码图片_webtest.zip"这个压缩包文件似乎包含了与Web应用开发相关的三个主要组件:用户统计、在线编辑器和验证码图片。下面将详细讨论这三个知识点。 首先,**在线用户统计*...

    如何基于spring security实现在线用户统计

    Spring Security 在线用户统计实现详解 在本文中,我们将详细介绍如何基于 Spring Security 实现在线用户统计。在线用户统计是指在系统中实时统计当前活跃用户的数量,以便更好地监控和管理系统的使用情况。 ...

    ASP.NET源码——Afritxia在线用户统计、在线编辑器、验证码图片.zip

    这个压缩包“ASP.NET源码——Afritxia在线用户统计、在线编辑器、验证码图片.zip”包含了几个关键的组件,让我们一一探讨它们的功能和实现原理。 1. **在线用户统计**: 在线用户统计功能通常用于实时跟踪和记录...

    ASP.NET-[其他类别]Afritxia在线用户统计、在线编辑器、验证码图片.zip

    在这个特定的压缩包文件中,我们关注的是三个关键组件:在线用户统计、在线编辑器和验证码图片。这些是Web开发中常见的功能,对于提升用户体验和网站安全性至关重要。 1. 在线用户统计: 在线用户统计功能允许网站...

    Afritxia在线用户统计、在线编辑器、验证码图片_aspx开发教程.rar

    在ASP.NET平台上,Afritxia在线用户统计、在线编辑器和验证码图片的开发教程涵盖了Web应用程序中的关键功能模块。这些组件对于任何交互式网站来说都至关重要,因为它们提供了实时的用户活动跟踪,方便的内容编辑以及...

    Ros统计在线用户

    完成以上配置后,您可以通过查看日志文件来获取在线用户统计的相关信息。具体操作方法如下: - 进入`Logs`页面或使用命令行工具查看日志; - 根据前面设置的日志级别筛选出相关的日志记录; - 分析日志内容以获取所...

    openfire记录在线统计人数插件

    在Openfire中,为了实现在线用户统计的功能,通常需要借助特定的插件来完成。"openfire记录在线统计人数插件"就是这样一个工具,它能够帮助管理员实时监控和记录系统中的在线用户数量,对于系统管理和运营分析具有...

    ASP.NET中在线用户统计

    统计在线用户的作用不言而喻,就是为了网站管理者可以知道当前用户的多少,然后根据用户数量来观察服务器或者程序的性能,从而可以直观的了解到网站的吸引力或者网站程序的效率。现在,我们就介绍一个简单明了的方法...

    一个统计在线用户的算法

    标题与描述概述的知识点是关于一个用于实时统计在线用户的算法,该算法旨在精确地记录当前活跃在网站上的用户数量,并能够及时更新用户状态,包括新登录、已下线或持续在线的状态。以下是对这一算法的深入解析: ##...

    230418-017shopvue(在线用户统计的前端实现)

    //初始化当前页的渲染数据集列表实例。 const currentPageList = ref([]); //获取当前页面渲染显示所需的数据源。 const currentPageInit = async () =&gt; { const res = await onlineCustomerIndex(pagination....

    jsp+servlet+java 实现统计在线人数,在线用户.txt

    根据提供的文件信息,我们可以分析出该系统通过JSP、Servlet以及Java技术实现了一个简单的在线用户统计功能。下面将从以下几个方面进行详细解析: ### 一、项目架构与技术栈 本项目主要使用了JSP(Java Server ...

Global site tag (gtag.js) - Google Analytics