如何找出我的基于servlet的应用程序在任何给定时刻处理的打开会话

时间:2010-01-21 23:04:43

标签: servlets httpsession session-management

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

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:7)

实施HttpSessionListener,为其提供static Set<HttpSession>属性,在sessionCreated()方法期间向其添加会话,在sessionDestroyed()方法期间从中删除会话,将侦听器注册为<listener>中的web.xml。现在你有一个类,它在当前JBoss实例中收集了所有打开的会话。这是一个基本的例子:

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实现{{3 } 以及并基本上添加以下方法:

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();

答案 1 :(得分:3)

也许使用JMX bean更优雅,不需要代码。只需阅读

的值

data:jboss.web:type = Manager,path = / myapplication,host = localhost“activeSessions