Java如何计算在线用户数?
当您拥有一个Web应用程序时,您可能想知道当前有多少用户在线或已连接到您的网站。如果您访问过一些在线网络论坛,则可以看到;通常在首页上;他们的在线用户列表,或者可能只是当前在线用户的数量。
我们如何知道/计算当前有多少会话或用户连接到我们的网站。您是否想知道?让我们看看JavaServletAPI在此问题上为我们提供了什么。
ServletAPI具有一个接口javax.servlet.http.HttpSessionListener,该接口的实现将能够在创建或销毁新会话时随时由Servlet引擎通知。
该接口有两种方法可以实现:这些方法是sessionCreated(HttpSessionEventse)和sessionDestroyed(HttpSessionEventse)。这些方法将被称为分别创建一个新会话和该会话即将被销毁的通知。
现在,让我们创建会话监听器。下面的代码是我们的类将要实现的代码。
package org.nhooo.example.servlet; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import javax.servlet.http.HttpSession; import java.util.List; import java.util.ArrayList; public class SessionCounter implements HttpSessionListener { private List<String> sessions = new ArrayList<>(); public static final String COUNTER = "session-counter"; public void sessionCreated(HttpSessionEvent event) { System.out.println("SessionCounter.sessionCreated"); HttpSession session = event.getSession(); sessions.add(session.getId()); session.setAttribute(SessionCounter.COUNTER, this); } public void sessionDestroyed(HttpSessionEvent event) { System.out.println("SessionCounter.sessionDestroyed"); HttpSession session = event.getSession(); sessions.remove(session.getId()); session.setAttribute(SessionCounter.COUNTER, this); } public int getActiveSessionNumber() { return sessions.size(); } }
为了显示当前在线用户的信息,我们需要创建一个简单的JSP页面。这个JSP文件将从HttpSession属性名为counter中获取联机用户的编号,这个属性是我们在上面的侦听器中设置的。
<%@ page import="org.nhooo.example.servlet.SessionCounter" %> <html> <head> <title>Session Counter</title> </head> <body> <% SessionCounter counter = (SessionCounter) session.getAttribute( SessionCounter.COUNTER); %> Number of online user(s): <%= counter.getActiveSessionNumber() %> </body> </html>
让侦听器工作的最后一步是在web.xml文件中注册它。下面是如何在web.xml中注册侦听器的示例。
<?xml version="1.0" encoding="UTF-8"?> <!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> <display-name>Servlet Examples</display-name> <listener> <listener-class> org.nhooo.example.servlet.SessionCounter </listener-class> </listener> <session-config> <session-timeout>1</session-timeout> </session-config> </web-app>