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.
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) {
public boolean exist(String username) {
if (sessions.containsKey(username)) {
return true;
}
return false;
return false;
}
public boolean addSession(HttpSession session) {
public boolean addSession(HttpSession session) {
if (sessions.containsKey( session.getAttribute("username"))) {
return false;
}
sessions.put((String) session.getAttribute("username"), session);
return true;
sessions.put((String) session.getAttribute("username"), session);
return true;
}
public HttpSession getSession(String username) {
public HttpSession getSession(String username) {
return (HttpSession) sessions.get(username);
}
public boolean removeSession(String username) {
public boolean removeSession(String username) {
if (!sessions.containsKey(username)) {
return false;
}
sessions.remove(username);
return true;
sessions.remove(username);
return true;
}
private static SessionManager sessionManager;
public static SessionManager getSessionManager() {
private static SessionManager sessionManager;
public static SessionManager getSessionManager() {
if (sessionManager == null) {
sessionManager = new SessionManager();
}
return sessionManager;
return sessionManager;
}
public 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);
} 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:
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:
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:
Posta un commento