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

session监听器(可用于统计在线人数,了解系统当前的使用客户)

    博客分类:
  • java
阅读更多
★★★ 本篇为原创,需要引用转载的朋友请注明:《 http://stephen830.iteye.com/blog/338291 》 谢谢支持! ★★★

在系统运行中,有时候我们想了解下当前使用系统的用户,有多少人在使用系统?具体是哪些人在使用系统?

这时候,就可以通过session监听器(javax.servlet.http.HttpSessionAttributeListener 接口)的功能来实现。当用户登录系统的时候,通过特定的session属性记录下用户的登录情况。

整个过程可以分为以下4步:

第1步 准备session监听器处理类。
(如下面的SessionListener.java)
/*
 * @(#)SessionListener.java	1.00	2009/02/20
 * CopyRight(C) stephen(zhoujianqiang AT gmail DOT com) 2009-2014, All rights reserved.
 */
package com.stephen.filter;

import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

/**
 * session监听器. <br>
 * 在WEB容器的web.xml中添加本监听器的调用,具体格式如下:(其中的"[","]"分别用" <",">"替换) <br>
 * 
 * <pre>
 * 
 *    [web-app]
 *    [filter]
 *    ...
 *    [/filter]
 *    [filter-mapping]
 *    ...
 *    [/filter-mapping]
 *    ...
 *    [listener][listener-class]com.stephen.filter.SessionListener[/listener-class][/listener]
 *    ...
 *    [servlet]
 *    ...
 *    [/servlet]
 *    ...
 *    [/web-app]
 *  
 * </pre>
 * 
 * 注意在web.xml中配置的位置. <br>
 * 
 * @author stephen
 * @version 1.00
 * @see javax.servlet.http.HttpSessionAttributeListener
 */
public class SessionListener implements HttpSessionAttributeListener {
	/**
	 * 定义监听的session属性名.
	 */
	public final static String LISTENER_NAME = "_login";
	
	/**
	 * 定义存储客户登录session的集合.
	 */
	private static List sessions = new ArrayList();

	/**
	 * 加入session时的监听方法.
	 * 
	 * @param HttpSessionBindingEvent
	 *            session事件
	 */
	public void attributeAdded(HttpSessionBindingEvent sbe) {
		if (LISTENER_NAME.equals(sbe.getName())) {
			sessions.add(sbe.getValue());
		}
	}

	/**
	 * session失效时的监听方法.
	 * 
	 * @param HttpSessionBindingEvent
	 *            session事件
	 */
	public void attributeRemoved(HttpSessionBindingEvent sbe) {
		if (LISTENER_NAME.equals(sbe.getName())) {
			sessions.remove(sbe.getValue());
		}
	}

	/**
	 * session覆盖时的监听方法.
	 * 
	 * @param HttpSessionBindingEvent
	 *            session事件
	 */
	public void attributeReplaced(HttpSessionBindingEvent sbe) {
	}

	/**
	 * 返回客户登录session的集合.
	 * 
	 * @return
	 */
	public static List getSessions() {
		return sessions;
	}
}


注意其中的_login就是设定的特殊session属性,当然你可以改成别的名字。

第2步 将session监听器配置到web.xml中.(参考如下的web.xml配置)

<?xml version="1.0" ?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
		
	<listener><listener-class>com.stephen.filter.SessionListener</listener-class></listener>

	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>

</web-app>


上面的 <listener><listener-class>com.stephen.filter.SessionListener</listener-class></listener> 就是配置session监听器的。

在你的web.xml配置文件中添加上这一行就可以了(要注意添加的位置)。

第3步 当用户登录时监听用户。

当用户成功登录后执行下面的代码。

//记入session监听器
session.setAttribute(com.stephen.filter.SessionListener.LISTENER_NAME,new OnlineSession(request.getRemoteAddr(),userName,new Date().toString()));

注意在上面的代码中使用了新的OnlineSession类,OnlineSession类封装了登录用户的信息(如用户ip,用户名,登录时间).

OnlineSession具体的内容如下:
/*
 * @(#)OnlineSession.java	1.00	2009/02/20
 * CopyRight(C) stephen(zhoujianqiang AT gmail DOT com) 2009-2014, All rights reserved.
 */
package com.stephen.filter;

/**
 * 客户session信息.
 * 
 * @author  stephen
 * @version 1.0.0
 */
public final class OnlineSession {
    
    
    /**
     * 客户计算机的ip.
     */
    private String ip = null;
    /**
     * 客户登录名.
     */
    private String loginId = null;
    /**
     * 客户登录系统时间.
     */
    private String onlineTime = null;
    
    /**
     * 构造器.
     * @param ip
     * @param loginId
     * @param onlineTime
     */
    public OnlineSession(String ip,String loginId,String onlineTime){
    	this.ip=ip;
    	this.loginId=loginId;
    	this.onlineTime=onlineTime;
    }
    
	/**
	 * @return Returns the ip.
	 */
	public String getIp() {
		return ip;
	}
	/**
	 * @param ip The ip to set.
	 */
	public void setIp(String ip) {
		this.ip = ip;
	}
	/**
	 * @return Returns the loginId.
	 */
	public String getLoginId() {
		return loginId;
	}
	/**
	 * @param loginId The loginId to set.
	 */
	public void setLoginId(String loginId) {
		this.loginId = loginId;
	}
	/**
	 * @return Returns the onlineTime.
	 */
	public String getOnlineTime() {
		return onlineTime;
	}
	/**
	 * @param onlineTime The onlineTime to set.
	 */
	public void setOnlineTime(String onlineTime) {
		this.onlineTime = onlineTime;
	}
}



第4步 显示在线用户的情况。

可以直接通过 SessionListener.getSessions()方法来取得所有在线的用户。
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ page import="java.util.List"%>
<%@ page import="java.util.Iterator"%>
<%@ page import="com.stephen.filter.SessionListener"%>
<%@ page import="com.stephen.filter.OnlineSession"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>Online session Query</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head><body bgcolor="#e5ecf9" topmargin="5px" leftmargin="5px" rightmargin="5px">
<%
	List sessions = SessionListener.getSessions();
	String pageErrorInfo = null;
	try{
%>
		<h5>Online Employee</h5>
		
		<table width="100%" align="center" cellspacing="1" cellpadding="4" border="0">
		<tr id="listTitle">
		<td>No.</td>
		<td>登录Id</td>
		<td>登录时间</td>
		<td>ip</td>
		</tr>
<%
		StringBuffer datas = new StringBuffer();
		if(sessions!=null){
			OnlineSession onlineSession = null;
			Iterator it = sessions.iterator();
			int count=0;
			while(it.hasNext()){
				count++;
				onlineSession=(OnlineSession)it.next();
				datas.append("<tr><td>");
				datas.append(count);
				datas.append("</td><td>");
				datas.append(onlineSession.getLoginId());
				datas.append("</td><td>");
				datas.append(onlineSession.getOnlineTime());
				datas.append("</td><td>");
				datas.append(onlineSession.getIp());
				datas.append("</td></tr>");
			}
	    }
	    out.print(datas.toString());
%>
		</table>
<%
	}catch(Exception e){
		pageErrorInfo = e.toString();
	}finally{
		if(pageErrorInfo!=null){
%>
			<font color="red">Error:<%=pageErrorInfo%></font>
<%
		}
%>
		</body></html>
<%		
	}
%>



最后的说明:

如果你的系统中有注销(或者退出登录)类似的功能(功能中调用了 session.invalidate() 方法),那么用户的信息就会自动从上面的列表中删除。如果没有使用注销功能,则只能等到session超时候才能从列表中自动删除。


22
4
分享到:
评论
17 楼 kivil 2014-01-13  
stephen830 写道
yeminping 写道

可以统计,但Sessiond要等到JAVA虚拟机的执行才释放,这样的统计不能实时


如果用户不用指定注销或退出登录功能,则只能等session超时候web容器才会将该客户的session删除。

大多数客户习惯直接关浏览器,而不会去点注销功能。所以很多时候客户明明已经离开了,但还要过一段时间session才会消失。


关闭浏览器。session还在吗?
16 楼 Bsklqgy 2013-01-25  
session
15 楼 valen926 2009-05-30  
session监听器是对整个网站的session吗?我设了两个session 我只想对一个session设置监听器,另外一个不设置 .
14 楼 yananay 2009-03-02  
引用

对于搞技术的而言,适当的还是要做到“知所以然”,而不要简单的满足“知其然”。当然这还取决于每个人自己的想法。


大哥,用 session listener 去统计在线人数这个东西已经很普通了吧,google一搜一大把,恐怕好多人都是 “知所以然”,并非如你所想的 “满足“知其然””。

时代在进步,所以说,是不是应该介绍点新东西,新方法呢。
13 楼 stephen830 2009-03-02  
yananay 写道

引用
拨开云雾见本质,你可以看看实现的本质是什么。 如果什么东西都用“本质“,那建议大家直接使用汇编编写所有的程序。


对于搞技术的而言,适当的还是要做到“知所以然”,而不要简单的满足“知其然”。当然这还取决于每个人自己的想法。



12 楼 yananay 2009-03-02  
引用
拨开云雾见本质,你可以看看实现的本质是什么。


如果什么东西都用“本质“,那建议大家直接使用汇编编写所有的程序。
11 楼 stephen830 2009-03-01  
yelang2009 写道

能自动刷新吗?

session监听本身就是自动的,只要用户加入/刈除session就会刷新session监听中定义的List集合。
10 楼 yelang2009 2009-03-01  
能自动刷新吗?
9 楼 stephen830 2009-02-28  
laogao3232 写道

这个。。。。。。。。。。。很多例子!请问能不能做用户登陆状态监听啊!这个问题好像不容易!

你所说的“用户登陆状态监听”是啥样的呢?
8 楼 laogao3232 2009-02-27  
这个。。。。。。。。。。。很多例子!
请问能不能做用户登陆状态监听啊!
这个问题好像不容易!
7 楼 tutu07 2009-02-27  
统计在线人数,最好和单点登录联系起来用。
6 楼 stephen830 2009-02-26  
yeminping 写道

可以统计,但Sessiond要等到JAVA虚拟机的执行才释放,这样的统计不能实时


如果用户不用指定注销或退出登录功能,则只能等session超时候web容器才会将该客户的session删除。

大多数客户习惯直接关浏览器,而不会去点注销功能。所以很多时候客户明明已经离开了,但还要过一段时间session才会消失。

5 楼 yeminping 2009-02-26  
可以统计,但Sessiond要等到JAVA虚拟机的执行才释放,这样的统计不能实时
4 楼 stephen830 2009-02-26  
yananay 写道

使用 session 的方式比较麻烦,而且也不建议直接对session操作。应该使用 spring之类的 session scope bean 去管理session的内容。http://www.memestorm.com/blog/session-scoped-beans-in-spring-20/http://www.memestorm.com/blog/use-springs-bean-lifecycle-callback-methods-to-control-your-destiny/这两个文章都有点参考价值。


拨开云雾见本质,你可以看看实现的本质是什么。
3 楼 yananay 2009-02-26  
使用 session 的方式比较麻烦,而且也不建议直接对session操作。
应该使用 spring之类的 session scope bean 去管理session的内容。

http://www.memestorm.com/blog/session-scoped-beans-in-spring-20/

http://www.memestorm.com/blog/use-springs-bean-lifecycle-callback-methods-to-control-your-destiny/

这两个文章都有点参考价值。
2 楼 天机老人 2009-02-26  
呵呵,看起来好像不简单!
1 楼 lkjust08 2009-02-25  
受教了

相关推荐

    Java监听器学习 统计当前在线人数

    在Java编程中,监听器(Listener)是一种关键的机制,它允许程序对特定事件的发生做出反应。本主题将深入探讨如何使用...理解Java监听器的概念,并结合适当的工具和技术,能帮助你构建出稳定且高效的在线人数统计系统。

    监听器实现在线人数统计

    在Java Web开发中,我们可以使用Servlet API中的Session监听器来实现这一功能。Session监听器是实现了`javax.servlet.http.HttpSessionListener`接口的类,它可以监听到Session的创建和销毁事件,从而判断用户的登录...

    springboot 用监听器统计在线人数案例分析

    本文通过对Spring Boot用监听器统计在线人数案例的分析,详细介绍了实现该功能的步骤和注意事项。 首先,要实现该功能,我们需要创建一个实现了HttpSessionListener接口的监听器类。在Spring Boot中,可以通过在...

    Javaweb监听器实例之统计在线人数

    本文将详细介绍如何使用监听器来统计在线用户人数,包括实现的基本思路、具体代码实现以及相关类的结构。 首先,我们要明确监听器的种类,本案例中将使用HttpSessionListener来监听会话的创建和销毁事件,以及...

    session初始化+网站流量统计+在线人数

    本主题将深入探讨如何进行session初始化、实现网站流量统计以及监控在线人数,这些都是Web应用开发中的重要环节。 首先,让我们了解什么是Session。在Servlet环境中,每当用户打开一个新的会话(比如首次访问网页)...

    HttpSessionBindingListener实现在线人员查看即人数统计

    5. **显示在线人数**:你可以创建一个Servlet或JSP页面,实时显示当前在线人数。这可以通过访问一个全局维护的在线用户计数器或者查询数据库中的统计信息来实现。 6. **优化与注意事项**:为了防止因用户关闭浏览器...

    java web在线人数统计/监听

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

    day18 监听器 统计在线人数,定时销毁超时session,钝化活化session,在线列表显示和踢人功能防止用户自动登录,在线支付

    在本主题“day18 监听器 统计在线人数,定时销毁超时session,钝化活化session,在线列表显示和踢人功能防止用户自动登录,在线支付”中,我们将深入探讨这些关键知识点。 首先,让我们了解监听器的作用。监听器是...

    java统计在线人数

    在Java Web开发中,统计在线人数是一项常见的需求,它能够帮助我们了解系统当前的活跃用户量。本项目通过实现`HttpSessionListener`接口,每隔一分钟动态更新在线人数,提供了高效且可靠的解决方案。以下是对这个...

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

    - 可能还包括一个用于统计在线用户的类或方法,以及相关的定时任务或异步操作。 为了实现这样的系统,开发者需要理解`Session`的工作原理,包括其生命周期、配置以及在多服务器环境下的扩展性问题。同时,还需要...

    JAVA jsp统计在线人数

    在Java JSP(JavaServer Pages)环境中,统计在线人数是一项常见的需求,这通常涉及到服务器端的会话管理、数据持久化以及实时性处理。这里我们将深入探讨如何利用JSP技术来实现这一功能。 首先,我们需要理解JSP的...

    JSP 在线人数统计的实现

    在Web开发中,实时在线人数统计是一项常见的需求,它可以帮助网站管理员了解当前有多少用户正在访问网站,以便优化资源分配和服务质量。JSP(JavaServer Pages)作为Java Web开发的重要组成部分,可以方便地实现这一...

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

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

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

    【Java Web 监听器统计在线用户及人数详解】 在Java Web开发中,实时统计在线用户数量是一项重要的功能,这通常涉及到对用户会话(Session)的管理。本篇文章将详细解析如何使用Java Web监听器来实现这一目标。 ...

    网站统计在线人数,当前年、月、日访问量JAVA代码

    1. **创建会话监听器**:在Java Web应用中,可以创建一个实现了javax.servlet.HttpSessionListener的监听器类,用于在session创建和销毁时执行相应的操作。当新session创建时,增加在线人数;当session失效时,减少...

    Javaweb实现在线人数统计代码实例

    该类有三个方法:sessionCreated、sessionDestroyed和getActiveSessions,分别用于统计session的创建、销毁和获取当前在线人数。 4. sessionCreated方法:该方法在session创建时执行,用于增加在线人数统计。 5. ...

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

    2. 监听会话:使用HttpSessionListener监听器,可以监听会话的创建、销毁事件。当会话被销毁时,意味着用户可能已经离线。 3. 设置超时时间:服务器端可以通过setMaxInactiveInterval()设置会话的超时时间,超过这个...

    JSP中的在线人数统计

    为了实现在线人数统计,我们首先需要创建一个监听器类`OnLineDemo.java`,该类实现了`ServletContextListener`、`HttpSessionListener`和`HttpSessionAttributeListener`接口。 1. **监听器类`OnLineDemo.java`**:...

    利用java监听器实现在线人数统计

    需要注意的是,session监听器统计的在线人数是基于session的存在,这意味着即使用户打开网站后没有进行任何交互,只要浏览器保持打开状态,就会有一个活跃的session。这与Attribute监听器不同,Attribute监听器是...

    servlet 监听器范例

    通过这个“servlet 监听器范例”,我们不仅学习了如何使用Servlet监听器来统计在线用户,还了解了如何跟踪用户登录状态。这个示例对于理解和实现在Java Web应用程序中进行用户管理、监控系统活动具有很大的价值。

Global site tag (gtag.js) - Google Analytics