问题
I need to write a servlet that, when called, gets information about a list of the currently opened sessions.
Is there a way to do this?
回答1:
Implement HttpSessionListener, give it a static Set<HttpSession>
property, add the session to it during sessionCreated()
method, remove the session from it during sessionDestroyed()
method, register the listener as <listener>
in web.xml
. Now you've a class which has all open sessions in the current JBoss instance collected. Here's a basic example:
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;
}
}
Then in your servlet just do:
Set<HttpSession> sessions = HttpSessionCollector.getSessions();
If you rather want to store/get it in the application scope so that you can make the Set<HttpSession>
non-static, then let the HttpSessionCollector
implement ServletContextListener as well and add basically the following methods:
public void contextCreated(ServletContextEvent event) {
event.getServletContext().setAttribute("HttpSessionCollector.instance", this);
}
public static HttpSessionCollector getCurrentInstance(ServletContext context) {
return (HttpSessionCollector) context.getAttribute("HttpSessionCollector.instance");
}
which you can use in Servlet as follows:
HttpSessionCollector collector = HttpSessionCollector.getCurrentInstance(getServletContext());
Set<HttpSession> sessions = collector.getSessions();
回答2:
Perhaps using a JMX bean is more elegant and needs no code. Just read the value of
data: jboss.web:type=Manager,path=/myapplication,host=localhost" activeSessions
来源:https://stackoverflow.com/questions/2113662/how-to-find-out-what-open-sessions-my-servlet-based-application-is-handling-at-a