`

在线用户统计(一)

阅读更多
          好久之前看过下在线人数统计的问题,现在重新整理了一下,把自己写的一些例子发出来和大家分享,希望大家也提出一些想法或者例子,一起研究出最好的方案=^^=

在写文章之前先介绍一个HttpSessionBindingListener这个监听器,用来监听自己什么时候增加到会话中,或者从会话删除。实现HttpSessionBindingListener这个接口要实现2个方法:valueBound(当我知道我在一个会话中时要运行的代码),valueUnbound(当我知道已经不在一个会话时要运行的代码)

代码如下:
//实现一个HttpSessionBindingListener监听器-----OnLineUser.java

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import org.apache.log4j.Logger;
import java.util.*;

public class OnLineUser implements HttpSessionBindingListener {

	static Logger logger = Logger.getLogger(OnLineUser.class.getName());

	// 创建一个静态变量来保存在线用户
	private static Vector<String> users = new Vector<String>();
    
	//返回当前在线人数
	public int getCount() {

		return users.size();
	}
    
	//判断用户是否重复登陆
	public boolean existUser(String userName) {

		boolean existUser = false; // 用户不存在
		for (int i = 0; i < users.size(); i++) {
			if (userName.equals((String) users.get(i))) {
				existUser = true; // 用户已存在
				break;
			}
		}
		return existUser;
	}
    
	//从统计中删除用户
	public boolean deleteUser(String userName) {
		OnLineUser.logger.info("=============移除用户============");
		boolean flag = false;
		for (int i = 0; i < users.size(); i++) {
			if (userName.equals((String) users.get(i))) {
				users.remove(i);
				flag = true;
				break;
			}
		}
		return flag;
	}

	public void valueBound(HttpSessionBindingEvent e) {
		//每当OnLineUser这个实例被绑定到会话里面,就从统计中增加一个在线用户		
        users.add(e.getName());

		OnLineUser.logger.info(e.getName() + "\t登入到系统\t" + (new Date()));

		for (int i = 0; i < users.size(); i++) {
			OnLineUser.logger.info("第"+ (i+1) + "个在线用户:" + users.get(i));
		}
		OnLineUser.logger.info("在线用户数为:" + getCount() + "人");


	}

	public void valueUnbound(HttpSessionBindingEvent e) {
		String userName = e.getName();
        //每当OnLineUser的实例与Session解除绑定时,就从统计中移除改在线用户
		boolean flag = deleteUser(userName);
		if (flag == true) {
			OnLineUser.logger.info(userName + "\t退出系统\t" + (new Date()));
			OnLineUser.logger.info("\t在线用户数为:" + getCount());
		}
	}
    
	public static Vector getUsers() {
		return users;
	}

}

//敲完Listener的代码需要在DD中(web.xml)文件配置一下,只需要在web.xml增加下面这段即可
<!-- 配置listener -->
<listener>
<listener-class>com.listener.OnLineUser</listener-class>
</listener>
         <!--注意路径不一定是com.listener.OnLineUser,需按照你自己的实际路径 -->



//模拟一个业务逻辑组件的实现-----Service.java
public class Service {
     private static Service service;
     
	 private  String[] user = {"Jam","Rjx","Wjm","Jason"};
	 private  String[] pass = {"123","123","123","123"};
	   
     //单例模式的私有构造函数
     private Service(){
    	 
     }
     
     //返回Service实例
     public static Service getInstance(){
    	 if(service == null){
    		 synchronized(Service.class){
    			 if(service == null){
    				 service = new Service();
    			 }
    		 }
    	 }
    	 return service;
     }
     
     //本来是去数据库检查帐号密码是否一致,这里把情况简单化
     public boolean checkUser(String userName,String password){

    	   for(int i=0;i<user.length;i++){
    		   if(userName.equals(user[i]) && password.equals(pass[i])){
    			   return true;
    		   }    		  
    	   }
    	   return false;
     }
}




//控制层(表示层)的实现,当用户提交表单时就会来到这个Servlet-----LoginServlet.java
public class LoginServlet extends HttpServlet {
   
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

	    doPost(request,response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String userName = request.getParameter("userName");
		String password = request.getParameter("password");
		
		HttpSession session = request.getSession();
		
//调用service组件的checkUser方法
		boolean flag = Service.getInstance().checkUser(userName, password);
		if(flag == true){
			OnLineUser onLineUser = new OnLineUser();
			if(onLineUser.existUser(userName)){
				OnLineUser.logger.info(userName+"重复登陆");
				
			}
			else{
				
				session.setAttribute(userName, onLineUser);
//设置session的失效时间(秒为单位)
				session.setMaxInactiveInterval(10);
			}
		}
//跳转(请求分派)到onLineResult.jsp页面
		request.getRequestDispatcher("onLineResult.jsp").forward(request, response);
	}

}

//省略了Servlet在DD中的配置文件





//jsp客户端代码如下,代码比较简单,就不左解释了哈:)-----onLineLogin.jsp
<html>
  <head>
    <title>统计在线人数登陆页面</title>
  </head>
  
  <body>
        
     <form action="LoginServlet" method="post">
        <table border="1">
            <tr><td colspan="2" align="center"><font color="red">在线人数统计调查表</font></td></tr>
            <tr><td>请输入名字:</td><td><input type="text" name="userName"/></td></tr>              
            <tr><td>请输入密码:</td><td><input type="text" name="password"/></td></tr> 
            <tr align="center"><td colspan="2"><input type="submit" value="提交"></td></tr>
        </table>
     </form>
  </body>
</html>



//访问完控制层跳转的页面,显示在线人数-----onLineResult.jsp

<html>
  <head>
    <title>统计在线人数结果</title>
  </head> 
  <body>
    现在的在线人数是:<%=OnLineUser.getUsers().size() %>
  </body>
</html>




小结:在测试的过程中,我发现就算我设置session的过期时间为1秒,也要等几十秒,才会执行valueUnbound这个方法,不知道是session过期有延迟,还是监听器本身有延迟,暂时没什么头绪。至于这个做法,其中一个缺点是,当在线用户人数多的时候,后台会产生大量的OnLineUser的实例。欢迎大家提出更好的建议和方法:)
分享到:
评论
1 楼 makemyownlife 2010-11-16  
mark 下 呵呵

相关推荐

    JAVA Web在线用户统计

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

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

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

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

    接下来,"实时统计在线人数"则需要维护一个在线用户列表。这里用到了"vector对象的elements()方法",Vector是Java中的一个动态数组,它继承自ArrayList,支持同步操作,适合多线程环境。elements()方法返回一个...

    Ros统计在线用户

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

    统计用户在线时间统计用户在线时间

    在ASP编程环境中,统计用户在线时间是一个常见的需求,主要用于了解用户在网站上的活动时长,以便分析用户行为、优化用户体验或者进行数据统计。本篇将详细介绍如何利用ASP的Session技术来实现这一功能。 首先,ASP...

    一个统计在线用户的算法

    ### 实时在线用户统计算法原理 #### 全局变量与会话管理 该算法的核心依赖于会话(Session)管理和数据库操作。通过在`global.asa`文件中设置全局变量和事件处理,确保了服务器可以实时跟踪每个用户的在线状态。当...

    用户在线人数统计

    2. **心跳机制**:为了实现活动用户统计,我们需要设置一个心跳机制。用户在浏览网页时,每隔一段时间(如30秒)发送一个请求到服务器,表明他们还在活跃。这可以通过JavaScript定时器实现,在前端设置一个轮询,向...

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

    为了统计在线用户数,我们需要维护一个计数器。每当有新用户登录,增加计数器;而当用户退出或`Session`过期,减少计数器。`Session`有一个默认的超时时间,一般为20分钟,超过这个时间用户被认为已离线。可以定期...

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

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

    ASP.NET中在线用户统计

    现在,我们就介绍一个简单明了的方法来统计在线用户的多少,该方法的特点就是充分的利用了 ASP.NET的特点,结合global.asax文件,用Application和Session巧妙的实现在线用户的统计,由于程序中只用到一个 ...

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

    在Java编程领域,开发一个在线用户数统计组件是一项常见的任务,尤其对于构建实时Web应用程序和服务至关重要。这个组件的目的是提供一种高效、准确的方式来追踪和显示系统当前活跃的在线用户数量。下面将详细介绍...

    在线用户列表统计示例程序

    在线用户列表统计示例程序是一种常见的应用场景,尤其在实时聊天、社交网络或协作平台中,这类功能至关重要。它能够提供当前在线用户的信息,帮助管理员监控系统活跃度,同时也能为用户提供实时互动的感知。下面我们...

    在线人数统计程序(JSP)

    在线人数统计程序是Web开发中一个常见的功能,用于实时显示网站当前在线用户的数量。这个程序通常基于服务器端的技术实现,例如JavaServer Pages (JSP)。JSP是一种动态网页技术,它允许开发者在HTML页面中嵌入Java...

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

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

    SSH统计并显示当前在线用户信息

    如果你想要实时监控登录活动,可以使用`watch`命令与`who`或`w`结合,如`watch -n 5 who`,每隔5秒更新一次在线用户列表。 在与Oracle数据库相关的场景下,SSH可以用于远程管理数据库服务器。例如,你可以使用SSH...

    在线人数统计 在线统计

    在线人数统计是网络应用和服务中一个重要的组成部分,它主要用于了解网站、应用或者服务器在某一时间段内的用户活跃情况。在线人数统计通常涉及到多个技术层面,包括数据采集、处理、存储以及展示。下面将详细阐述...

    openfire记录在线统计人数插件

    2. **历史数据记录**:除了实时数据,插件还能够记录一段时间内的在线用户统计数据,比如每天、每周或每月的平均在线人数,便于分析用户的活跃周期和增长趋势。 3. **图表展示**:为了更直观地呈现数据,插件通常会...

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

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

    javaweb开发在线人数统计

    在线人数统计是 Java Web 开发中一个常见的功能,当一个用户登录后,显示欢迎信息,同时显示出当前在线的总人数和用户名单。当一个用户退出登录或者 Session 超时值发生时,从在线用户名单中删除这个用户,同时将...

    netty-socket实时在线人数统计

    本文将深入探讨如何使用SpringBoot 2.0与Netty-socket来实现一个实时在线人数统计的功能,并涉及到WebSocket协议的相关知识。 **SpringBoot 2.0** SpringBoot是Spring框架的一个轻量级容器,它简化了Spring应用...

Global site tag (gtag.js) - Google Analytics