我需要编写一个servlet,在调用时,获取有关当前打开的会话列表的信息。
有办法做到这一点吗?
答案 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