`

SessionListener与SessionAttributeListener统计用户在线问题

阅读更多
   最近用户急要一个在线统计用户列表的模块,在网上搜了些例子,大部分都是用SessionListener统计在线人数的,无法得到具体访问的用户列表。尝试了一下用
HttpSessionAttributeListener实现了需要的功能,缺点也还是不很准确,只能统计
一段时间内用户的在线情况。

   没有做过性能测试,不知道这样在高访问量下会不会有什么问题。

   实现原理和SessionListener差不多,也是实现一个监听器监听session,由于在SessionListener无法得到用户ID(userId),我在用户登录是用了session.setAttribute
方法,把用户ID添加到session中,覆盖attributeAdded方法得到用户ID放到容器里,(我这里用的是TreeMap,性能上要比HashMap差点,但涉及后台的分页和排序,就牺牲点性能吧),覆盖attributeRemoved 删除退出的用户(当然程序退出时要调用
session.removeAttribute).覆盖attributeReplaced方法,我这偷懒直接在里面又调用了
attributeAdded方法。

下面是主要代码

web.xml配置

	<listener>
	    <listener-class>com.listener.UserOnLineSessionListener</listener-class>
	</listener>


Listerner类

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Map;
import java.util.TreeMap;

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

public class UserOnLineSessionListener implements HttpSessionAttributeListener {
    private static Map<Integer,String> sessions = new TreeMap<Integer,String>();
	
    public UserOnLineSessionListener(){
    	
    }  

	@Override
	public void attributeAdded(HttpSessionBindingEvent event) {
		// TODO Auto-generated method stub
		HttpSession session = event.getSession();
               //如果不是userId跳出
		if ( !"userID".equals(event.getName())) return;
		Integer userId =Integer.parseInt((String)session.getAttribute("userID"));
		//生成当前时间,并转换成字符串
                Calendar cal = Calendar.getInstance();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		
		String mDateTime=sdf.format(cal.getTime());
		ServletContext application = session.getServletContext();
		if (sessions.size()==0){
			application.setAttribute("userList", sessions);
		}
		sessions.put(userId, mDateTime);
	}
	@Override
	public void attributeRemoved(HttpSessionBindingEvent event) {
		// TODO Auto-generated method stub
		
		if ("userID".equals(event.getName())) {
			Integer userId =Integer.parseInt((String)event.getValue());
			sessions.keySet().remove(userId);
		}
	}
	@Override
	public void attributeReplaced(HttpSessionBindingEvent event) {
		// TODO Auto-generated method stub
		attributeAdded(event);
	}
	public static Map<Integer, String> getSessions() {
		return sessions;
	}

}


关于怎么显示就不用多说了,从Map里面取出分页需要的UserList对象就可以了

分享到:
评论

相关推荐

    SessionListener

    1. **统计在线用户**:当`sessionCreated()`被调用时,增加在线用户计数;当`sessionDestroyed()`被调用时,减少计数。这样可以实时知道网站有多少活跃用户。 2. **资源释放**:如果`Session`中存储了大量资源,...

    sessionListener

    这个资源是针对session容器的,在具有多个session的session容器里需要进行注册,所以就有了这个代码。不过写的还是很粗糙的。

    使用SessionListener+持久化Session+Springmvc拦截器实现单点登录

    - 跨域问题:如果系统分布在不同的域名下,需要处理跨域`Cookie`的设置,确保用户认证信息可以在各个系统之间传递。 - 安全性:确保持久化的会话信息加密存储,防止敏感数据泄露。 - 性能优化:合理设置会话超时时间...

    session统计在线人数.rar

    在这个关于"session统计在线人数.rar"的压缩包中,包含了Java编程语言的一个示例项目,主要用于演示如何通过session对象来跟踪和统计网站或应用程序中的在线用户数量。Java Session是服务器端为每个客户端会话分配的...

    java统计在线人数

    通过这些事件,我们可以实时监控在线用户的数量。 2. **实现HttpSessionListener** 要创建一个`HttpSessionListener`,你需要创建一个新的Java类并实现`javax.servlet.http.HttpSessionListener`接口。在这个类中...

    解决在线用户列表和重复登录

    标题与描述均提到了“解决在线用户列表和重复登录”的问题,这在互联网应用中尤其重要,尤其是在涉及用户身份验证和会话管理的场景中。本文将深入探讨如何有效地管理和控制在线用户列表,以及如何避免同一用户在不同...

    用户重复登录问题

    ##### 3.1 保存在线用户信息 - 在`HttpSessionListener`中定义一个全局的`Map`对象,用来保存当前已登录的用户。 - 当用户登录成功时,将用户名保存到`HttpSession`中,并通过`HttpSessionAttributeListener`的`...

    S2SH用户重复登录问题[文].pdf

    这样做的目的是为了跟踪和管理每个在线用户的状态。 `sessionCreated()`方法在新的session被创建时调用,但在这个案例中,我们没有在这个方法中添加任何逻辑,因为我们的主要关注点是在用户登录时更新用户状态。 `...

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

    2. 调用SessionListener类的getCount静态方法获取当前在线用户数。 3. 将获取到的用户数使用out对象的println方法打印出来,这样用户就可以看到当前的在线人数。 在servlet中对session的监听器功能是非常灵活的,它...

    Java后台实现前台下线通知推送

    1. **监听用户状态**:我们需要一个机制来检测用户是否在线。这可以通过会话管理来实现。在Servlet中,我们可以使用HttpSession接口来创建、管理和销毁用户的会话。每当用户登录时,创建一个新的会话,并将其保存在...

    使用监听器跟踪session的生命周期和session的属性

    这通常发生在Session超时、用户注销或显式调用`HttpSession.invalidate()`时,开发者可以在此清理与该Session相关的资源。 示例代码: ```java public class SessionListener implements HttpSessionListener { ...

    JAVA SESSION监听器

    2. **统计在线用户**:维护一个全局计数器,每当有新的Session创建,计数器加一,Session销毁时减一,从而得到当前在线用户数量。 3. **Session有效期管理**:根据业务需求,可以在监听到Session即将过期时提醒用户...

    JAVA培训Servlet监听器.pdf

    SessionListener用于监听Session对象的创建和销毁,监听器类需要实现javax.servlet..SessionListener接口或者javax.servlet..SessionActivationListener接口,或者两个都实现。例如: ```java public class ...

    Servlet+IO的一个简单的模拟购物车程序

    同时,SessionListener可以用来检测用户的会话活动,比如当用户离开时清空其购物车。 5. **过滤器(Filter)**: 过滤器允许在请求到达Servlet之前或响应离开Servlet之后进行拦截和处理。在购物车系统中,过滤器可能...

    session监听小例子

    1. 统计在线用户:通过监听Session的创建和销毁,可以统计网站的实时在线用户数量。 2. 用户行为分析:记录用户Session的活跃时间、访问路径等,用于分析用户行为。 3. 资源管理:在Session销毁时释放占用的资源,...

    shiro用户教程pdf

    在线会话管理功能允许管理员实时监控和管理用户的会话状态,这对于大型应用来说非常重要。 以上是Apache Shiro框架的关键知识点概述。通过理解和掌握这些内容,开发者可以有效地利用Shiro来保护他们的应用,并实现...

    监听器与过滤器.pdf

    监听器的应用场景广泛,例如,初始化工作、配置文件加载、任务调度、统计在线用户数量等。 **过滤器(Filter)** 过滤器则是一种允许开发者在请求到达目标资源之前或之后进行处理的机制。它可以根据预设的条件决定...

    session过期时间设置

    在Session失效后,有时需要执行特定操作,例如控制在线用户数量或处理用户多次登录的问题。这时可以利用Servlet API中的监听器(Listener)来实现。监听器是Java Web应用程序中用于监听特定事件(如Session创建和...

    servlet监听器实现踢人小案例

    在`sessionDestroyed`方法中,我们可以检查会话的销毁原因,如果是因为超时或者其他特定条件(如用户请求注销),那么可以执行“踢人”操作,比如清理服务器上的用户信息,更新在线用户列表等。 至于提供的压缩包子...

    Servlet的监听器小DEMO

    监听器可以用来统计在线用户数量、清理过期会话、记录日志等。 在"ServletListenerExample"这个DEMO中,可能包含了一个名为`SessionListener`的类,它实现了`HttpSessionListener`接口,并且在`sessionCreated`和`...

Global site tag (gtag.js) - Google Analytics