`
__夜色
  • 浏览: 1188 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

监听统计在线人数

    博客分类:
  • java
阅读更多
1、了解如何使用HttpSessionListener监听session的销毁。
2、了解如何使用HttpSessionBindingListener监听session的销毁。
一、使用HttpSessionListener编写一个OnlineUserListener。
view plaincopy to clipboardprint?
package anni; 

import java.util.List; 
import javax.servlet.ServletContext; 
import javax.servlet.http.HttpSession; 
import javax.servlet.http.HttpSessionListener; 
import javax.servlet.http.HttpSessionEvent; 

public class OnlineUserListener implements HttpSessionListener { 

    public void sessionCreated(HttpSessionEvent event) { 
    } 

    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"); 
        onlineUserList.remove(username); 

        System.out.println(username + "超时退出。"); 
    } 

}
package anni;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;
public class OnlineUserListener implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent event) {
    }
    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");
        onlineUserList.remove(username);
        System.out.println(username + "超时退出。");
    }
}
OnlineUserListener实现了HttpSessionListener定义的两个方法:sessionCreated()和sessionDestroyed()。这两个方法可以监听到当前应用中session的创建和销毁情况。我们这里只用到sessionDestroyed()在session销毁时进行操作就可以。
从HttpSessionEvent中获得即将销毁的session,得到session中的用户名,并从在线列表中删除。最后一句向console打印一条信息,提示操作成功,这只是为了调试用,正常运行时删除即可。
为了让监听器发挥作用,我们将它添加到web.xml中:
view plaincopy to clipboardprint?
<listener> 
  <listener-class>anni.OnlineUserListener</listener-class> 
</listener>
<listener>
  <listener-class>anni.OnlineUserListener</listener-class>
</listener>
以下两种情况下就会发生sessionDestoryed(会话销毁)事件:
1、执行session.invalidate()方法时。
既然LogoutServlet.java中执行session.invalidate()时,会触发sessionDestory()从在线用户列表中清除当前用户,我们就不必在LogoutServlet.java中对在线列表进行操作了,所以LogoutServlet.java的内容现在是这样。
view plaincopy to clipboardprint?
public void doGet(HttpServletRequest request,HttpServletResponse response) 
    throws ServletException, IOException { 
    // 销毁session 
    request.getSession().invalidate(); 
    // 成功 
    response.sendRedirect("index.jsp"); 
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
    throws ServletException, IOException {
    // 销毁session
    request.getSession().invalidate();
    // 成功
    response.sendRedirect("index.jsp");
}
2、如果用户长时间没有访问服务器,超过了会话最大超时时间,服务器就会自动销毁超时的session。
会话超时时间可以在web.xml中进行设置,为了容易看到超时效果,我们将超时时间设置为最小值。
view plaincopy to clipboardprint?
<session-config> 
    <session-timeout>1</session-timeout> 
</session-config>
<session-config>
    <session-timeout>1</session-timeout>
</session-config> 时间单位是一分钟,并且只能是整数,如果是零或负数,那么会话就永远不会超时。
对应例子在08-01,为了验证OnlineUserListener是否能正常执行,我们可以登录两个用户,其中一个点击注销,另一个等待一分钟,然后可以在console中看到输出的信息。

二、使用HttpSessionBindingListener
HttpSessionBindingListener虽然叫做监听器,但使用方法与HttpSessionListener完全不同。我们实际看一下它是如何使用的。
我们的OnlineUserBindingListener实现了HttpSessionBindingListener接口,接口中共定义了两个方法:valueBound()和valueUnbound(),分别对应数据绑定,和取消绑定两个事件。
所谓对session进行数据绑定,就是调用session.setAttribute()把HttpSessionBindingListener保存进session中。我们在LoginServlet.java中进行这一步。
view plaincopy to clipboardprint?
public void valueBound(HttpSessionBindingEvent event) { 
    HttpSession session = event.getSession(); 
    ServletContext application = session.getServletContext(); 

    // 把用户名放入在线列表 
    List onlineUserList = (List) application.getAttribute("onlineUserList"); 
    // 第一次使用前,需要初始化 
    if (onlineUserList == null) { 
        onlineUserList = new ArrayList(); 
        application.setAttribute("onlineUserList", onlineUserList); 
    } 
    onlineUserList.add(this.username); 
}
public void valueBound(HttpSessionBindingEvent event) {
    HttpSession session = event.getSession();
    ServletContext application = session.getServletContext();
    // 把用户名放入在线列表
    List onlineUserList = (List) application.getAttribute("onlineUserList");
    // 第一次使用前,需要初始化
    if (onlineUserList == null) {
        onlineUserList = new ArrayList();
        application.setAttribute("onlineUserList", onlineUserList);
    }
    onlineUserList.add(this.username);
}
这就是HttpSessionBindingListener和HttpSessionListener之间的最大区别:HttpSessionListener只需要设置到web.xml中就可以监听整个应用中的所有session。HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。
从监听范围上比较,HttpSessionListener设置一次就可以监听所有session,HttpSessionBindingListener通常都是一对一的。
正是这种区别成就了HttpSessionBindingListener的优势,我们可以让每个listener对应一个username,这样就不需要每次再去session中读取username,进一步可以将所有操作在线列表的代码都移入listener,更容易维护。
valueBound()方法的代码如下:
view plaincopy to clipboardprint?
public void valueUnbound(HttpSessionBindingEvent event) { 
    HttpSession session = event.getSession(); 
    ServletContext application = session.getServletContext(); 

    // 从在线列表中删除用户名 
    List onlineUserList = (List) application.getAttribute("onlineUserList"); 
    onlineUserList.remove(this.username); 

    System.out.println(this.username + "退出。"); 
}
public void valueUnbound(HttpSessionBindingEvent event) {
    HttpSession session = event.getSession();
    ServletContext application = session.getServletContext();
    // 从在线列表中删除用户名
    List onlineUserList = (List) application.getAttribute("onlineUserList");
    onlineUserList.remove(this.username);
    System.out.println(this.username + "退出。");
}
这里可以直接使用listener的username操作在线列表,不必再去担心session中是否存在username。
valueUnbound的触发条件是以下三种情况:
执行session.invalidate()时。
session超时,自动销毁时。
执行session.setAttribute("onlineUserListener", "其他对象");或session.removeAttribute("onlineUserListener");将listener从session中删除时。
因此,只要不将listener从session中删除,就可以监听到session的销毁。
分享到:
评论

相关推荐

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

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

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

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

    监听器实现在线人数统计

    在这个场景下,我们关注的是如何利用监听器来实现在线人数的统计。在线人数统计是一项重要的功能,特别是在构建实时交互的Web应用或者聊天室时,能够提供实时的用户活跃度信息。 首先,我们需要理解业务需求。当...

    java web在线人数统计/监听

    本文将深入探讨如何使用Java Web技术来监听并统计在线人数。 1. **HTTP与Session** HTTP协议本身是无状态的,无法直接追踪用户的会话。为了在多个请求之间保持用户状态,Web服务器引入了Session机制。每当用户打开...

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

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

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

    3. **监听绑定事件**:在`valueBound()`方法中,你可以增加在线人数计数。因为每个在线用户都会有一个与之关联的session对象,所以每当有新的session对象被创建并绑定时,就代表有一个新用户上线。 4. **监听解绑...

    java监听器学习 统计在线人数

    本教程将深入讲解如何利用Java的监听器机制来统计在线人数,具体涉及到ServletContextListener、HttpSessionListener以及HttpSessionAttributeListener。 首先,`ServletContextListener`是Java Servlet API中的一...

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

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

    java统计在线人数

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

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

    【Java Web应用开发 53 课堂案例-应用监听器统计在线人数】 在Java Web开发中,统计在线用户数量是一项常见的需求,这通常涉及到监听器(Listeners)的使用。在这个课堂案例中,我们将学习如何利用`...

    asp.net统计在线人数

    我们可以通过`Session_Start`和`Session_End`事件在Global.asax文件中进行监听,每当新的会话开始或结束时,更新在线人数计数器。 ```csharp void Session_Start(object sender, EventArgs e) { // 在这里增加在线...

    netty-socket实时在线人数统计

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

    留言本--用DAO模式设计,servlet,监听器统计在线人数

    【标题】"留言本--用DAO模式设计,servlet,监听器统计在线人数"涉及到的是在Java Web开发中实现一个用户交互系统的核心技术。在这个项目中,DAO(Data Access Object)模式、Servlet以及监听器(Listener)是三个...

    在线人数统计程序(JSP)

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

    JAVA jsp统计在线人数

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

    java web 统计在线人数

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

    JSP统计在线人数实现

    在本文中,我们将深入探讨如何使用JavaServer Pages (JSP) 实现在线人数统计功能,以便展示当前在线的用户数量。我们将分析提供的代码段,并解释关键概念和技术。 首先,我们有一个名为`onLineUser`的类,它实现了`...

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

    在本主题“day18 监听器”中,我们将探讨如何利用监听器来统计在线人数、定时销毁超时session、实现session的钝化与活化,以及如何在系统中显示在线用户列表和实现踢人功能,从而防止用户自动登录。同时,还会涉及...

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

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

    JavaWeb 用session统计在线人数

    在JavaWeb开发中,"用session统计在线人数"是一个常见的需求,主要应用于网站或应用的实时用户活动监控。本文将详细解析如何利用session这一核心技术来实现这个功能。 首先,理解session的基本概念。在Web开发中,...

Global site tag (gtag.js) - Google Analytics