Servlet - Monitoraggio della sessione
HTTP è un protocollo "senza stato", il che significa che ogni volta che un client recupera una pagina Web, il client apre una connessione separata al server Web e il server automaticamente non conserva alcun record della precedente richiesta del client.
Esistono ancora tre modi per mantenere la sessione tra il client Web e il server Web:
Biscotti
Un server web può assegnare un ID di sessione univoco come cookie a ciascun client web e per le richieste successive dal client possono essere riconosciuti utilizzando il cookie ricevuto.
Questo potrebbe non essere un modo efficace perché molte volte il browser non supporta un cookie, quindi non consiglierei di utilizzare questa procedura per mantenere le sessioni.
Campi modulo nascosti
Un server web può inviare un campo modulo HTML nascosto insieme a un ID sessione univoco come segue:
<input type = "hidden" name = "sessionid" value = "12345">
Questa voce significa che, quando il modulo viene inviato, il nome e il valore specificati vengono inclusi automaticamente nei dati GET o POST. Ogni volta che il browser Web invia una richiesta, il valore session_id può essere utilizzato per tenere traccia di diversi browser Web.
Questo potrebbe essere un modo efficace per tenere traccia della sessione, ma fare clic su un normale collegamento ipertestuale (<A HREF...>) non comporta l'invio di un modulo, quindi i campi del modulo nascosti non possono supportare il monitoraggio della sessione generale.
Riscrittura URL
È possibile aggiungere alcuni dati aggiuntivi alla fine di ogni URL che identifica la sessione e il server può associare quell'identificatore di sessione ai dati che ha memorizzato su quella sessione.
Ad esempio, con http://tutorialspoint.com/file.htm;sessionid = 12345, l'identificatore di sessione è allegato come sessionid = 12345 a cui è possibile accedere dal server Web per identificare il client.
La riscrittura degli URL è un modo migliore per mantenere le sessioni e funziona anche quando i browser non supportano i cookie. Lo svantaggio della riscrittura degli URL è che dovresti generare dinamicamente ogni URL per assegnare un ID di sessione, anche nel caso di una semplice pagina HTML statica.
L'oggetto HttpSession
Oltre ai tre modi sopra menzionati, servlet fornisce l'interfaccia HttpSession che fornisce un modo per identificare un utente attraverso più di una richiesta di pagina o visita a un sito Web e per memorizzare le informazioni su quell'utente.
Il contenitore servlet utilizza questa interfaccia per creare una sessione tra un client HTTP e un server HTTP. La sessione persiste per un periodo di tempo specificato, attraverso più di una connessione o richiesta di pagina da parte dell'utente.
Si otterrebbe l'oggetto HttpSession chiamando il metodo pubblico getSession() di HttpServletRequest, come di seguito -
HttpSession session = request.getSession();
È necessario chiamare request.getSession () prima di inviare qualsiasi contenuto del documento al client. Ecco un riepilogo dei metodi importanti disponibili tramite l'oggetto HttpSession:
Sr.No. | Metodo e descrizione |
---|---|
1 | public Object getAttribute(String name) Questo metodo restituisce l'oggetto associato con il nome specificato in questa sessione o null se nessun oggetto è associato al nome. |
2 | public Enumeration getAttributeNames() Questo metodo restituisce un'enumerazione di oggetti String contenente i nomi di tutti gli oggetti associati a questa sessione. |
3 | public long getCreationTime() Questo metodo restituisce l'ora in cui è stata creata questa sessione, misurata in millisecondi dalla mezzanotte del 1 gennaio 1970 GMT. |
4 | public String getId() Questo metodo restituisce una stringa contenente l'identificatore univoco assegnato a questa sessione. |
5 | public long getLastAccessedTime() Questo metodo restituisce l'ora dell'ultimo accesso della sessione, nel formato di millisecondi dalla mezzanotte del 1 gennaio 1970 GMT |
6 | public int getMaxInactiveInterval() Questo metodo restituisce l'intervallo di tempo massimo (secondi) durante il quale il contenitore servlet manterrà la sessione aperta tra gli accessi del client. |
7 | public void invalidate() Questo metodo invalida questa sessione e svincola tutti gli oggetti ad essa associati. |
8 | public boolean isNew( Questo metodo restituisce true se il client non è ancora a conoscenza della sessione o se il client sceglie di non partecipare alla sessione. |
9 | public void removeAttribute(String name) Questo metodo rimuove l'oggetto associato con il nome specificato da questa sessione. |
10 | public void setAttribute(String name, Object value) Questo metodo associa un oggetto a questa sessione, utilizzando il nome specificato. |
11 | public void setMaxInactiveInterval(int interval) Questo metodo specifica il tempo, in secondi, tra le richieste del client prima che il contenitore servlet invalidi questa sessione. |
Esempio di monitoraggio della sessione
Questo esempio descrive come usare l'oggetto HttpSession per scoprire l'ora di creazione e l'ora dell'ultimo accesso per una sessione. Assoceremo una nuova sessione alla richiesta se non ne esiste già una.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class SessionTrack extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Create a session object if it is already not created.
HttpSession session = request.getSession(true);
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this web page.
Date lastAccessTime = new Date(session.getLastAccessedTime());
String title = "Welcome Back to my website";
Integer visitCount = new Integer(0);
String visitCountKey = new String("visitCount");
String userIDKey = new String("userID");
String userID = new String("ABCD");
// Check if this is new comer on your web page.
if (session.isNew()) {
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
} else {
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
}
session.setAttribute(visitCountKey, visitCount);
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<h2 align = \"center\">Session Infomation</h2>\n" +
"<table border = \"1\" align = \"center\">\n" +
"<tr bgcolor = \"#949494\">\n" +
" <th>Session info</th><th>value</th>
</tr>\n" +
"<tr>\n" +
" <td>id</td>\n" +
" <td>" + session.getId() + "</td>
</tr>\n" +
"<tr>\n" +
" <td>Creation Time</td>\n" +
" <td>" + createTime + " </td>
</tr>\n" +
"<tr>\n" +
" <td>Time of Last Access</td>\n" +
" <td>" + lastAccessTime + " </td>
</tr>\n" +
"<tr>\n" +
" <td>User ID</td>\n" +
" <td>" + userID + " </td>
</tr>\n" +
"<tr>\n" +
" <td>Number of visits</td>\n" +
" <td>" + visitCount + "</td>
</tr>\n" +
"</table>\n" +
"</body>
</html>"
);
}
}
Compila il servlet sopra SessionTracke creare la voce appropriata nel file web.xml. L'esecuzione di http: // localhost: 8080 / SessionTrack visualizzerà il seguente risultato quando verrà eseguito per la prima volta:
Welcome to my website
Session Infomation
Session info
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
0
Ora prova a eseguire lo stesso servlet per la seconda volta, visualizzerà il seguente risultato.
Welcome Back to my website
Session Infomation
info type
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
1
Eliminazione dei dati della sessione
Quando hai finito con i dati della sessione di un utente, hai diverse opzioni:
Remove a particular attribute- È possibile chiamare il metodo public void removeAttribute (nome stringa) per eliminare il valore associato a una particolare chiave.
Delete the whole session- Puoi chiamare il metodo public void invalidate () per scartare un'intera sessione.
Setting Session timeout- Puoi chiamare il metodo public void setMaxInactiveInterval (int interval) per impostare il timeout per una sessione individualmente.
Log the user out - I server che supportano i servlet 2.4, puoi chiamare logout per disconnettere il client dal server Web e invalidare tutte le sessioni appartenenti a tutti gli utenti.
web.xml Configuration - Se si utilizza Tomcat, oltre ai metodi sopra menzionati, è possibile configurare il timeout della sessione nel file web.xml come segue.
<session-config>
<session-timeout>15</session-timeout>
</session-config>
Il timeout è espresso in minuti e sostituisce il timeout predefinito che è di 30 minuti in Tomcat.
Il metodo getMaxInactiveInterval () in un servlet restituisce il periodo di timeout per quella sessione in secondi. Quindi, se la tua sessione è configurata in web.xml per 15 minuti, getMaxInactiveInterval () restituisce 900.