Java如何计算在线用户数?

当您拥有一个Web应用程序时,您可能想知道当前有多少用户在线或已连接到您的网站。如果您访问过一些在线网络论坛,则可以看到;通常在首页上;他们的在线用户列表,或者可能只是当前在线用户的数量。

我们如何知道/计算当前有多少会话或用户连接到我们的网站。您是否想知道?让我们看看Java Servlet API在此问题上为我们提供了什么。

Servlet API具有一个接口javax.servlet.http.HttpSessionListener,该接口的实现将能够在创建或销毁新会话时随时由Servlet引擎通知。

该接口有两种方法可以实现:这些方法是sessionCreated(HttpSessionEvent se)和sessionDestroyed(HttpSessionEvent se)。这些方法将被称为分别创建一个新会话和该会话即将被销毁的通知。

现在,让我们创建会话监听器。下面的代码是我们的类将要实现的代码。

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>