I need to get all active sessions from servlet.
But I believe this API is obsolated…
That is why, I tried to implement using existing API.
package jp.develop.tool.servlet; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionActivationListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * Session list providing Listener. */ public class SessionListListener implements HttpSessionListener, HttpSessionActivationListener, Serializable { private static final boolean DEBUG = true; private static final long serialVersionUID = 7490899888824580726L; private static final String SESSION_LISTENER_KEY = "_sessionListListener"; private static Object lock = new Object(); private static Listsessions = new ArrayList (); private static List sessionsForOutput = Collections.unmodifiableList(sessions); /** * Get all sessions. * @return All sessions list. */ public static List getSessions() { return sessionsForOutput; } /** * Default Constructor. */ public SessionListListener() { log(String.format("Session List Listener is initialized.")); } /** * @see HttpSessionListener#sessionCreated(HttpSessionEvent) */ public void sessionCreated(HttpSessionEvent event) { synchronized (lock) { HttpSession session = event.getSession(); session.setAttribute(SESSION_LISTENER_KEY, this); sessions.add(session); log(String.format("Session Added: %s", session.getId())); } } /** * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent) */ public void sessionDestroyed(HttpSessionEvent event) { synchronized (lock) { HttpSession session = event.getSession(); session.removeAttribute(SESSION_LISTENER_KEY); sessions.remove(session); // XXX May not good implementation for performance. log(String.format("Session Removed: %s", session.getId())); } } /** * @see HttpSessionActivationListener#sessionDidActivate(HttpSessionEvent) */ public void sessionDidActivate(HttpSessionEvent event) { synchronized (lock) { HttpSession session = event.getSession(); sessions.add(session); log(String.format("Session Activate: %s", session.getId())); } } /** * @see HttpSessionActivationListener#sessionWillPassivate(HttpSessionEvent) */ public void sessionWillPassivate(HttpSessionEvent event) { synchronized (lock) { HttpSession session = event.getSession(); sessions.remove(session); // XXX May not good implementation for performance. log(String.format("Session Passivate: %s", session.getId())); } } private static void log(String message) { if (DEBUG) { System.out.println(message); } } }
If anybody find a problem, please let me know…