我需要编写一个servlet,当它被调用时,它获取有关当前打开的 session 列表的信息。

有没有办法做到这一点?

最佳答案

实现 HttpSessionListener ,为其提供static Set<HttpSession>属性,在sessionCreated()方法期间向其添加 session ,在sessionDestroyed()方法期间从其删除 session ,在<listener>中将监听器注册为web.xml。现在,您有一个类,其中包含当前JBoss实例中所有打开的 session 。这是一个基本示例:

public HttpSessionCollector implements HttpSessionListener {
    private static final Set<HttpSession> sessions = ConcurrentHashMap.newKeySet();

    public void sessionCreated(HttpSessionEvent event) {
        sessions.add(event.getSession());
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        sessions.remove(event.getSession());
    }

    public static Set<HttpSession> getSessions() {
        return sessions;
    }
}

然后在您的servlet中执行以下操作:
Set<HttpSession> sessions = HttpSessionCollector.getSessions();

如果您想在应用程序范围内存储/获取它,以便可以将Set<HttpSession> 设置为非静态,则让HttpSessionCollector也实现 ServletContextListener 并基本上添加以下方法:
public void contextCreated(ServletContextEvent event) {
    event.getServletContext().setAttribute("HttpSessionCollector.instance", this);
}

public static HttpSessionCollector getCurrentInstance(ServletContext context) {
    return (HttpSessionCollector) context.getAttribute("HttpSessionCollector.instance");
}

您可以在Servlet中使用它,如下所示:
HttpSessionCollector collector = HttpSessionCollector.getCurrentInstance(getServletContext());
Set<HttpSession> sessions = collector.getSessions();

10-08 01:45