`
bdk82924
  • 浏览: 565176 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Web应用中统计在线用户

    博客分类:
  • Web
 
阅读更多
忽然想起要做个在线用户的功能

提供一个页面来监控所有在线用户,其实只要知道用户名、ip地址、登录时间即可 ,
   当然,扩展后看到所有访问web应用的在线用户也可以(即没登录的也算)

在网上搜索了点资料 ,写了简单的例子,本地已经调试通过,还有待完善

列表 :
web.xml
onlineUser.jsp
OnlineUserListener.java    implements HttpSessionListener
OnLineUsers.java           implements HttpSessionBindingListener



1、如果只要简单的统计在线用户,直接使用  onlineUser.jsp 就可以
   不过 不可以监控 session自动失效等情况
2、加入了OnlineUserListener.java(HttpSessionListener) 后,解决了 session失效的监控
   这个需要在web.xml中注册
  
  <listener> 
  <listener-class>OnlineUserListener</listener-class> 
</listener> 


3、OnLineUsers.java (HttpSessionBindingListener)
   这个类是用来扩展的,实现 HttpSessionBindingListener,首先不需要在web.xml中注册 ,只需要在登录的时候 调用 session.setAttribute("xx", new OnLineUsers(userName)); 来绑定session ,可以考虑后续通过sessionid 来控制session


下面直接上代码了

onlineUser.jsp
<%@ page language="java" import="java.util.*,OnLineUsers"
	pageEncoding="utf-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<base href="<%=basePath%>">

		<title>My JSP 'index.jsp' starting page</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">

		<%
		    String userName = request.getParameter("userName");
		    String type = request.getParameter("type");
		    String sessionUserName = (String) session.getAttribute("userName");
		    sessionUserName = (sessionUserName == null) ? "" : sessionUserName;
		    // 把用户名放入在线列表 
		    List onlineUserList = (List) application.getAttribute("onlineUserList");
		    // 第一次使用前,需要初始化 
		    if (onlineUserList == null)
		    {
		        onlineUserList = new ArrayList();
		        application.setAttribute("onlineUserList", onlineUserList);
		    }

		    if (userName != null && "login".equals(type))
		    {

		        if (sessionUserName != null)
		        {
		            //先删除 之前的用户 ,再加入新登录的用户 ,这样可以保证不会重复增加 
		            onlineUserList.remove(sessionUserName);
		        }
		        // 把用户名保存进session 
		        session.setAttribute("userName", userName);

		        //如何控制 在一台机器登录两次 后 不会重复增加?
		        onlineUserList.add(userName);

		        response.sendRedirect("onlineUser.jsp");
		        
		        //绑定session 
		        session.setAttribute("xx", new OnLineUsers(userName));
		    }

		    //注销操作 ,一种是正常流程退出(页面上注销),还有一种是关闭浏览器、session自动失效的在Servlet中控制
		    if ("logout".equals(type))
		    {

		        // 销毁session 
		        session.invalidate();
		        // 从在线列表中删除用户名 

		        if (onlineUserList != null)
		        {
		            onlineUserList.remove(userName);
		        }

		        sessionUserName = "";

		    }
		%>
	</HEAD>

	<BODY>
		<h1>
			在线用户Demo
		</h1>

		<h3>
			当前用户:<%=sessionUserName%>
			[
			<a href="onlineUser.jsp?type=logout">注销</a>]
		</h3>

		<form action="onlineUser.jsp?type=login" method="post">
			<input name="userName" value="userName" size="20" type="text">

			<input name="passWord" value="passWord" size="20" type="password">
			<input type="submit" value="登录">
		</form>

		<hr>
		<h3>
			在线用户列表
		</h3>
		<table>
			<%
			    for (int i = 0; i < onlineUserList.size(); i++)
			    {
			        String onlineUsername = (String) onlineUserList.get(i);
			%>
			<tr>
				<td><%=onlineUsername%></td>
			</tr>
			<%
			    }
			%>
		</table>


	</BODY>
</HTML>




OnlineUserListener.java 需要在web.xml中注册
 
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * @author 版本 监听所有session的创建和销毁 ,需要在web.xml中注册
 */
public class OnlineUserListener implements HttpSessionListener
{
    /**
     * 新建session
     */
    public void sessionCreated(HttpSessionEvent event)
    {
        System.out.println("新建session:" + event.getSession().getId());
    }

    /**
     * 销毁 session ,如session失效,测试时候可以修改 web.xml 中 session-timeout
     */
    public void sessionDestroyed(HttpSessionEvent event)
    {
        HttpSession session = event.getSession();
        ServletContext application = session.getServletContext();
        // 取得登录的用户名
        String username = (String) session.getAttribute("userName");
        // 从在线列表中删除用户名
        List onlineUserList = (List) application.getAttribute("onlineUserList");
        if (onlineUserList != null)
        {
            onlineUserList.remove(username);
        }
        System.out.println(username + "已经退出!");
    }
}






OnLineUsers ,扩展用的,这次基本没派上用场
 
import java.util.HashMap;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

/**
 * 
 * 需要在登录时候调用 session.setAttribute("xx",new OnLineUsers(userName));
 * 即可绑定,不需要在web.xml中注册
 * 
 * 
 * 可以通过这个来 保存sessionid 和session的对应关系,供需要的时候使用
 * 
 * @author
 * @date 2013-1-5 上午09:06:06
 * 
 * @version 1.0
 */
public class OnLineUsers implements HttpSessionBindingListener
{

    String yhm;

    public OnLineUsers(String yhm)
    {
        System.out.println("OnLineUsers...");
        this.yhm = yhm;
    }

    public void valueBound(HttpSessionBindingEvent event)
    {
        System.out.println("OnLineUsers... valueBound");
        HttpSession session = event.getSession();
        ServletContext context = session.getServletContext();
        HashMap<String, String> olu = (HashMap<String, String>) context.getAttribute("OnLineUsers");
        if (olu == null)
        {
            olu = new HashMap<String, String>();
            context.setAttribute("OnLineUsers", olu);
        }
        olu.put(yhm, session.getId());
    }

    public void valueUnbound(HttpSessionBindingEvent event)
    {
        System.out.println("OnLineUsers... valueUnbound");
        HttpSession session = event.getSession();
        ServletContext context = session.getServletContext();
        HashMap<String, String> olu = (HashMap<String, String>) context.getAttribute("OnLineUsers");
        if (olu != null)
        {
            olu.remove(yhm);
        }
    }

}


  • 大小: 21.4 KB
分享到:
评论

相关推荐

    JAVA Web在线用户统计

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

    java web在线人数统计/监听

    Java Web在线人数统计是Web应用程序中常见的需求,用于获取当前网站活跃用户数量。这个功能的实现通常基于HTTP协议的工作机制,特别是对Session的管理和监听。本文将深入探讨如何使用Java Web技术来监听并统计在线...

    应用java实现在线用户数统计组件(源代码)

    在Java编程领域,开发一个在线用户数统计组件是一项常见的任务,尤其对于构建实时Web应用程序和服务至关重要。...通过学习和理解这些源代码,开发者可以更好地掌握Java在Web应用统计领域的应用,提升自己的技能水平。

    Java Web应用开发 53 课堂案例-应用监听器统计在线人数.docx

    【Java Web应用开发 53 课堂案例-应用监听器统计在线人数】 在Java Web开发中,统计在线用户数量是一项常见的需求,...通过这个案例,开发者可以深入理解Java Web应用中监听器的概念及其在统计在线人数中的实际应用。

    java web 统计在线人数

    在Java Web开发中,统计在线人数是一项常见的需求,它能够帮助我们了解网站或应用的实时活跃用户数量。这里我们将深入探讨如何实现这一功能。 首先,我们需要理解“在线人数”的定义。通常,它指的是在一定时间窗口...

    判断用户是否在线和实时统计在线人数

    在Web应用中,用户的在线状态通常基于HTTP会话(Session)。当用户访问网站并登录后,服务器会为该用户创建一个唯一的会话ID,并将其保存在服务器端,同时将这个ID通过Cookie发送给客户端。每次用户发送请求时,都会...

    .net C# 利用session控制用户重复登录及统计在线用户数解决方案

    在.NET C#开发环境中,`Session` 是一种用于存储客户端会话状态的关键技术。它允许开发者在用户浏览器会话期间保持特定...通过深入理解和合理运用`Session`,开发者能够更好地管理用户会话,优化Web应用程序的功能。

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

    Servlet监听器是Java Web开发中的一个重要组件,它们允许开发者在特定事件发生时执行代码,比如当Web应用程序启动或停止时,或者当用户会话被创建、更新或销毁时。在"jsp中监听器实现在线用户统计"这个场景下,我们...

    web在线用户简单实现

    2. **Session管理**:在Web应用中,Session是用于跟踪用户状态的一种机制。当用户登录后,服务器会为该用户创建一个Session,并在客户端保存一个Session ID,后续的每次请求都会携带这个ID,以便服务器识别用户身份...

    webchart网统计统计报表

    在WebChart插件中,折线图被广泛用于各种场景,例如监控网站流量、分析销售趋势、追踪用户行为等。通过折线图,我们可以清晰地看到数据在不同时间段内的增减情况,从而对业务表现进行深入分析。 **WebChart插件特性...

    web网页 统计图

    在Web开发中,统计图是展示数据和信息的重要方式,特别是在数据分析、监控或者用户界面设计中。本主题主要关注如何使用CSS(层叠样式表)和JavaScript来创建动态且交互式的网页统计图。CSS用于控制网页元素的外观,...

    java web监听器统计在线用户及人数

    总结来说,通过结合使用`HttpSessionListener`和`ServletRequestListener`,并结合`web.xml`中的配置,可以有效地统计Java Web应用程序中的在线用户人数。需要注意的是,实际项目中可能还需要处理各种异常情况,如...

    明御WEB应用防火墙产品配置手册V3.0.4.0.doc

    根据提供的文件信息,可以总结和生成以下几个相关的IT知识点: ### 1. 产品概述 #### 1.1 安恒WAF产品概述 ...通过对这些知识点的学习和掌握,用户可以更好地利用该产品来保护自己的Web应用免受攻击。

    Anchiva WEB应用防火墙V3.5用户手册

    ### Anchiva WEB应用防火墙V3.5 用户手册知识点概览 #### 一、产品概述 **Anchiva WEB应用防火墙(WAF)**是一款专门针对Web应用程序提供防护的安全设备,通过实时分析和过滤进出Web服务器的HTTP/HTTPS流量,有效...

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

    - 在Java Web应用程序中,`HttpSession`对象用于存储特定于某个用户的会话数据。 - `HttpSession`提供了跨多个请求存储和检索数据的能力,这对于跟踪在线用户非常有用。 3. **Servlet** - Servlet是Java EE的一...

    Java Web应用开发项目教程(附电子教案,程序源代码,习题答案)

    10. **项目实战**:教程中的案例涵盖了多个实际应用场景,如用户注册登录、商品展示与购买、数据统计分析等,这些项目经验将帮助学习者巩固理论知识,提升解决实际问题的能力。 通过本教程的学习,读者不仅能掌握...

    Spring boot通过HttpSessionListener监听器统计在线人数的实现代码

    在Spring boot中通过HttpSessionListener监听器统计在线人数是一种常见的技术实现方式,适用于需要跟踪和管理用户会话状态的Web应用程序。以下是从给定文件中提炼的关键知识点。 首先,了解HttpSessionListener接口...

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

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

Global site tag (gtag.js) - Google Analytics