Per tenere traccia delle sessioni attive nella nostra applicazione occorre creare un listener di sessione che ci permetta di intercettare tutti i client che si connettono e si disconnettono.
Per la creazione di un listener è necessario implementare la classe javax.servlet.http.HttpSessionListener. I metodi definiti dall'interfaccia sono i seguenti:
void sessionCreated (HttpSessionEvent e)
void sessionDestroyed (HttpSessionEvent e)
Il metodo sessionCreated
, viene invocato nel momento in cui il Container crea una nuova sessione, mentre il metodo sessionDestroyed
, viene invocato quando la sessione viene distrutta. Naturalmente, il metodo sessionDestroyed
viene invocato sia nel caso in cui la sessione venga invalidata esplicitamente mediante il metodo invalidate
, sia nel caso in cui la sessione venga invalidata automaticamente dal container, perché scade il timeout.
Entrambi i metodi ricevono in ingresso un'istanza della classe HttpSessionEvent, mediante la quale è possibile intercettare diverse informazioni sulla sessione.
Per la creazione pratica, nella nostra classe Listener definiamo una banalissima Collection di Stringhe che conterrà l'elenco delle sessioni create.
Nel metodo sessionCreated
aggiungiamo alla lista l'ID della sessione creata. Nel metodo sessionDestroyed
eliminiamo l'ID della sessione distrutta. Definiamo anche un metodo pubblico che ci permette di ottenere la lista delle sessioni attive.
public class HtmlSessionListener implements HttpSessionListener{
private static Collection<String> utenti = new ArrayList<String>();
public void sessionCreated(HttpSessionEvent e){
System.out.println("Nuova sessione creata. Il suo id è " + e.getSession().getId());
utenti.add(e.getSession().getId());
}
public void sessionDestroyed(HttpSessionEvent e){
System.out.println("La sessione con id " + e.getSession().getId() + " è stata distrutta");
utenti.remove(e.getSession().getId());
}
public static Collection<String> getUtenti(){
return utenti;
}
}
Per attivare il Listener è necessario definirlo nel file web.xml.
<listener>
<display-name>HtmlSessionListener</display-name>
<listener-class>lucasantaniello.listener.HtmlSessionListener</listener-class>
</listener>
Il tutto può essere testando creando una semplice JSP, nella quale stampiamo il numero di sessioni attive e i relativi ID di sessione che sono stati assegnati.
<%@page import="lucasantaniello.listener.HtmlSessionListener"%>
<%@page import="java.util.Iterator"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Html.it - Utenti connessi</title>
</head>
<body>
Gli utenti connessi al sistema sono
<%= HtmlSessionListener.getUtenti().size() %>
<%
Iterator<String> it = HtmlSessionListener.getUtenti().iterator();
while (it.hasNext()){
String id = it.next();
%><p><%= id %></p>
<%
}
%>
</body>
</html>
Per testare l'esempio, è utile impostare un valore basso al timeout di sessione. Per far questo è necessario inserire nel web.xml il seguente tag:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
Qualora sia necessario, è possibile creare un listener che tiene traccia anche degli oggetti inseriti ed eliminati della sessione. Per fare questo è necessario implementare anche l'interfaccia javax.servlet.http.HttpSessionAttributeListener nella quale sono definiti i tre metodi:
void attributeAdded(HttpSessionBindingEvent e)
: viene richiamato quando un nuovo oggetto viene inserito in sessione;void attributeRemoved(HttpSessionBindingEvent e)
: viene richiamato quando un oggetto viene eliminato dalla sessione;void attributeReplaced(HttpSessionBindingEvent e)
: viene richiamato quando un oggetto viene modificato.