mercoledì 15 ottobre 2008

Sessioni HTTP Uniche

Vediamo come è possibile estendere il codice del post precedente per implementare facilmente un meccanismo per gestire il problema delle sessioni multiple per utente.
Definiamo una classe che ha la funzione di tenere traccia di tutte le sessioni http attive sul server mediante un HashMap.

package web;
import java.util.HashMap;
import javax.servlet.http.HttpSession;
public class SessionManager {
private HashMap sessions;
public boolean exist(String username) {
if (sessions.containsKey(username)) {
return true;
}
return false;
}
public boolean addSession(HttpSession session) {
if (sessions.containsKey( session.getAttribute("username"))) {
return false;
}
sessions.put((String) session.getAttribute("username"), session);
return true;
}
public HttpSession getSession(String username) {
return (HttpSession) sessions.get(username);
}
public boolean removeSession(String username) {
if (!sessions.containsKey(username)) {
return false;
}
sessions.remove(username);
return true;
}
private static SessionManager sessionManager;
public static SessionManager getSessionManager() {
if (sessionManager == null) {
sessionManager = new SessionManager();
}
return sessionManager;
}
public SessionManager() {
sessions = new HashMap();
}
}

Tale classe deve essere definita rispettando il pattern Singleton ed essere utilizzata all'interno di una servlet ogni volta che si vuole creare una nuova sessione, nel seguente modo

if(SessionManager.getInstance.exist(username)) {
     SessionManager manager = SessionManager.getInstance();
logout(manager.getSession(username) );
manager.removeSession(username);
}

in cui il metodo private void logout( HttpSession session) implementa le azioni necessarie ad invalidare la sessione.
Ovviamente, come descritto nel post precedente, è necessario aggiungere un elemento application listener in /WEB-INF/web.xml:

<?xml version="1.0" ...>
<web-app>
<listener>
<listener-class> web.SessionManager </listener-class>
</listener>
...
</web-app>

Meccanismo di lock su una coppia <username,password>:
Se si vuole usare il meccanismo illustrato per per fare in modo che per esempio una coppia <username,password> venga usata da un solo cliente alla volta basta riscrivere il codice utilizzato all'interno della servlet come segue:

if(SessionManager.getInstance.exist(username)) {
response.sendError(403);return;
}


Nessun commento: