JSP - Monitoraggio della sessione
In questo capitolo, discuteremo del monitoraggio della sessione in JSP. 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.
Mantenimento della sessione tra client Web e server
Parliamo ora di alcune opzioni per mantenere la sessione tra il Web Client e il Web Server:
Biscotti
Un webserver può assegnare un ID di sessione univoco come cookie a ogni web client e per le successive richieste del client possono essere riconosciuti utilizzando il cookie ricevuto.
Questo potrebbe non essere un modo efficace in quanto il browser a volte non supporta un cookie. Non è consigliabile 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 automaticamente inclusi nel file GET o il POSTdati. Ogni volta che il browser Web invia la richiesta, il filesession_id valore può essere utilizzato per tenere traccia di diversi browser web.
Questo può essere un modo efficace per tenere traccia della sessione, ma facendo clic su un normale collegamento ipertestuale (<A HREF...>) non si ottiene l'invio di un modulo, quindi anche i campi del modulo nascosti non possono supportare il monitoraggio della sessione generale.
Riscrittura URL
Puoi aggiungere alcuni dati extra alla fine di ogni URL. Questi dati identificano la sessione; il server può associare quell'identificativo di sessione con i 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 per i browser quando non supportano i cookie. Lo svantaggio qui è che dovrai generare dinamicamente ogni URL per assegnare un ID di sessione sebbene la pagina sia una semplice pagina HTML statica.
La sessione Object
Oltre alle opzioni sopra menzionate, JSP utilizza il servlet fornito dall'interfaccia HttpSession. Questa interfaccia fornisce un modo per identificare un utente attraverso.
- una richiesta di una pagina o
- visita a un sito Web o
- memorizzare le informazioni su quell'utente
Per impostazione predefinita, i JSP hanno il rilevamento della sessione abilitato e un nuovo oggetto HttpSession viene istanziato automaticamente per ogni nuovo client. La disabilitazione del monitoraggio della sessione richiede la disattivazione esplicita impostando l'attributo di sessione della direttiva della pagina su false come segue:
<%@ page session = "false" %>
Il motore JSP espone l'oggetto HttpSession all'autore JSP tramite implicit sessionoggetto. Dasession oggetto è già fornito al programmatore JSP, il programmatore può immediatamente iniziare a memorizzare e recuperare i dati dall'oggetto senza alcuna inizializzazione o getSession().
Di seguito è riportato un riepilogo dei metodi importanti disponibili tramite l'oggetto sessione:
S.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'ultima volta che il client ha inviato una richiesta associata a questa sessione, come il numero di millisecondi dalla mezzanotte del 1 gennaio 1970 GMT. |
6 | public int getMaxInactiveInterval() Questo metodo restituisce l'intervallo di tempo massimo, in secondi, durante il quale il contenitore servlet manterrà aperta questa sessione 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.
<%@ page import = "java.io.*,java.util.*" %>
<%
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this Webpage.
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 Webpage.
if (session.isNew() ){
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
session.setAttribute(visitCountKey, visitCount);
}
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
session.setAttribute(visitCountKey, visitCount);
%>
<html>
<head>
<title>Session Tracking</title>
</head>
<body>
<center>
<h1>Session Tracking</h1>
</center>
<table border = "1" align = "center">
<tr bgcolor = "#949494">
<th>Session info</th>
<th>Value</th>
</tr>
<tr>
<td>id</td>
<td><% out.print( session.getId()); %></td>
</tr>
<tr>
<td>Creation Time</td>
<td><% out.print(createTime); %></td>
</tr>
<tr>
<td>Time of Last Access</td>
<td><% out.print(lastAccessTime); %></td>
</tr>
<tr>
<td>User ID</td>
<td><% out.print(userID); %></td>
</tr>
<tr>
<td>Number of visits</td>
<td><% out.print(visitCount); %></td>
</tr>
</table>
</body>
</html>
Ora inserisci il codice sopra main.jsp e prova ad accedere http://localhost:8080/main.jsp. Una volta eseguito l'URL, riceverai il seguente risultato:
Benvenuto nel mio sito web
Session Information
Informazioni sulla sessione | valore |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Tempo di creazione | Tue Jun 08 17:26:40 GMT + 04: 00 2010 |
Ora dell'ultimo accesso | Tue Jun 08 17:26:40 GMT + 04: 00 2010 |
ID utente | ABCD |
Numero di visite | 0 |
Ora prova a eseguire lo stesso JSP per la seconda volta, riceverai il seguente risultato.
Bentornato al mio sito web
Session Information
tipo di informazioni | valore |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Tempo di creazione | Tue Jun 08 17:26:40 GMT + 04: 00 2010 |
Ora dell'ultimo accesso | Tue Jun 08 17:26:40 GMT + 04: 00 2010 |
ID utente | ABCD |
Numero di visite | 1 |
Eliminazione dei dati di sessione
Quando hai finito con i dati della sessione di un utente, hai diverse opzioni:
Remove a particular attribute - Puoi chiamare il public void removeAttribute(String name) metodo per eliminare il valore associato a una determinata chiave.
Delete the whole session - Puoi chiamare il public void invalidate() metodo per scartare un'intera sessione.
Setting Session timeout - Puoi chiamare il public void setMaxInactiveInterval(int interval) metodo 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 stai utilizzando Tomcat, oltre ai metodi sopra menzionati, puoi 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 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.