我需要编写一个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();