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>