Servlet HttpSessionListener监听器统计网站在线人数

在许多网站或者软件应用中都有统计当前在线人数这一功能。在通常情况下,当一个用户进入网站时就会创建一个 HttpSession 对象,而当用户离开网站时,HttpSession 对象就会被销毁。

在 Servlet 的八种监听器中,HttpSessionListener 监听器就可以监听 Web 应用中 HttpSession 对象的创建和销毁过程。因此,可以使用实现了 HttpSessionListener 接口的监听器统计网站的当前在线人数。下面将分步骤讲解如何使用监听器统计网站当前在线人数。

1. 创建监听器

在 filterDemo01 项目的 com.mengma.listener 包中,创建一个实现了 HttpSessionListener 接口的监听器类 OnlineListener,在该类中编写用于实现统计网站在线人数的代码,如下所示。

  1. package com.mengma.listener;
  2. import javax.servlet.ServletContext;
  3. import javax.servlet.http.HttpSessionEvent;
  4. import javax.servlet.http.HttpSessionListener;
  5. public class OnlineListener implements HttpSessionListener {
  6. private int count = 0; // 用于统计在线人数
  7. @Override
  8. public void sessionCreated(HttpSessionEvent hse) {
  9. count++; // Session对象创建时count变量加1
  10. ServletContext context = hse.getSession().getServletContext();
  11. context.setAttribute("count", new Integer(count));
  12. }
  13. @Override
  14. public void sessionDestroyed(HttpSessionEvent hse) {
  15. count--; // session对象销毁时count变量减1
  16. ServletContext context = hse.getSession().getServletContext();
  17. context.setAttribute("count", new Integer(count));
  18. }
  19. }

在 OnlineListener.java 中,首先定义了一个用于统计在线人数的成员变量 count。当每次监听到 HttpSession 对象创建时,count 成员变量会加 1。当每次监听到 HttpSession 对象销毁时,count 成员变量会减 1。

在每次修改 count 成员变量后,还应该将 count 成员变量的值保存到 ServletContext 对象中,以便其他

JSP

页面程序可以从 ServletContext 对象中取出 count 成员变量,从而在页面上显示当前在线用户数量。

在 web.xml 文件中,配置 OnlineListener 事件监听器,具体代码如下:

  1. <listener>
  2. <listener-class>
  3. com.mengma.listener.OnlineListener
  4. </listener-class>
  5. </listener>

需要注意的是,这个 HttpSession 对象在不活动时的最长存活时间仍然是 2min。

2. 创建首页和注销页面

1)实现首页

在项目的 WebContext 目录中,创建一个名称为 index.jsp 的页面,该页面用于保存在 ServletContext 对象中的 count 变量值,即相当于显示当前在线人数,如下所示。

  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. <html>
  4. <head>
  5. <title>首页</title>
  6. </head>
  7. <body>
  8. <h3>
  9. 当前在线人数为:<%=application.getAttribute("count") %>
  10. </h3>
  11. <a href="<%=response.encodeUrl("logout.jsp") %>">退出登录</a>
  12. </body>
  13. </html>

2)实现注销页面

在项目的 WebContext 目录中,编写注销页面 logout.jsp,logout.jsp 页面用于使当前 Session 对象失效,即完成用户注销功能,如下所示。

  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. <html>
  4. <head>
  5. <title>注销页面</title>
  6. </head>
  7. <body>
  8. <%session.invalidate();%>
  9. <h3>您已退出本系统</h3>
  10. </body>
  11. </html>

3. 运行项目并查看结果

启动 Tomcat 服务器,在浏览器的地址栏中输入地址 http://localhost:8080/filterDemo01/index.jsp 访问 index.jsp 页面,然后再分别开启两个不同的浏览器窗口(如火狐和谷歌浏览器)同时访问 index.jsp 页面(目的是防止同一个浏览器共享同一个Session会话),此时,各个浏览器窗口中显示的结果如图 1 所示。


图 1 login.jsp页面

单击图 1 中任意一个浏览器窗口中的“退出登录”超链接,都会访问 logout.jsp 页面,而 logout.jsp 页面中的 session.invalidate() 语句会使当前 Session 失效,从而触发 HttpSession 对象的销毁事件并调用监听器 OnlineListener 中的 sessionDestroyed() 方法,使统计用户数量的 count 变量减 1。

然后,刷新其余的浏览器窗口,此时,各个浏览器窗口中显示的结果如图 2 所示。


图 2 logout.jsp页面

从图 2 中可以看出,谷歌浏览器中的用户已被注销,而其余两个浏览器窗口中的在线人数显示为2。

需要注意的是,如果直接关闭图 2 所示的某个浏览器窗口或保持浏览器窗口不刷新,与之对应的 HttpSession 对象会在 2 分钟之后才被销毁,即统计的在线人数的 count 变量会在 2 分钟后自动减 1。因此,可以说明网站统计的在线人数并不是真正意义上的并发访问人数,而是指某一个时间段内的访问人数。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我来回答你的问题。 首先,我们需要定义一个Listener,用于监听网站的Session创建和销毁事件。当一个用户登录网站时,会创建一个Session,当用户退出时,Session会被销毁。我们可以通过监听这些事件来统计在线人数。 下面是一个简单的Session监听器的代码示例: ```java import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class OnlineCountListener implements HttpSessionListener { private static int onlineCount = 0; @Override public void sessionCreated(HttpSessionEvent se) { // 新建Session时,统计在线人数加1 onlineCount++; System.out.println("有新用户登录,当前在线人数为:" + onlineCount); } @Override public void sessionDestroyed(HttpSessionEvent se) { // 销毁Session时,统计在线人数减1 onlineCount--; System.out.println("有用户退出,当前在线人数为:" + onlineCount); } } ``` 然后,我们需要在web.xml文件中配置该Listener: ```xml <listener> <listener-class>com.example.OnlineCountListener</listener-class> </listener> ``` 最后,在Servlet中,我们可以通过ServletContext获取在线人数统计结果: ```java import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/onlineCount") public class OnlineCountServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取ServletContext对象 ServletContext servletContext = req.getServletContext(); // 获取在线人数统计结果 int onlineCount = (int) servletContext.getAttribute("onlineCount"); // 返回统计结果 resp.getWriter().write("当前在线人数为:" + onlineCount); } } ``` 以上就是一个简单的网站在线人数统计的实现方法,通过Listener监听Session事件,通过ServletContext保存在线人数统计结果,通过Servlet提供在线人数查询服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智慧浩海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值