English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Servlet Session 跟踪

HTTP è un protocollo "senza stato", il che significa che ogni volta che il client recupera una pagina web, il client apre una connessione separata al server web e il server non mantiene automaticamente alcuna registrazione delle richieste precedenti del client.

Tuttavia, ci sono ancora tre modi per mantenere la sessione di sessione tra il client web e il server web:

Cookies

Un server web può assegnare un ID di sessione di sessione univoco come cookie per ogni client web, che può essere utilizzato per identificare le richieste successive del client.

Questo potrebbe non essere un metodo efficace, poiché molti browser non supportano i cookie, quindi raccomandiamo di non utilizzare questo metodo per mantenere la sessione di sessione.

Campi di modulo nascosti

Un server web può inviare un campo di modulo HTML nascosto e un ID di sessione di sessione univoco, come segue:

<input type="hidden" name="sessionid" value="12345">

Questa voce significa che quando il modulo viene inviato, i nomi e i valori specificati vengono automaticamente inclusi nei dati GET o POST. Ogni volta che il browser web invia una richiesta di ritorno, il valore session_id può essere utilizzato per mantenere il tracciamento di diversi browser web.

Questo potrebbe essere un metodo efficace per mantenere il tracciamento della sessione di sessione, ma fare clic sui link ipertestuali tradizionali non causa la presentazione del modulo, quindi i campi di modulo nascosti non supportano il tracciamento della sessione di sessione tradizionale.

URL rewriting

Puoi aggiungere dati aggiuntivi alla fine di ogni URL per identificare la sessione di sessione, il server associerà l'identificatore di sessione di sessione con i dati memorizzati relativi alla sessione di sessione.

Ad esempio, http://oldtoolbag.com/file.htm;sessionid=12345, l'identificatore di sessione di sessione viene aggiunto come sessionid=12345, l'identificatore può essere accessibile dal server Web per identificare il client.

La URL rewriting è un modo migliore per mantenere la sessione di sessione, che funziona bene quando il browser non supporta i cookie, ma il suo svantaggio è che genera dinamicamente ogni URL per assegnare un ID di sessione di sessione alla pagina, anche nei semplici HTML statici.

Oggetto HttpSession

Oltre ai tre modi menzionati sopra, Servlet fornisce anche l'interfaccia HttpSession, che offre un modo per identificare l'utente e memorizzare informazioni sull'utente durante la navigazione su più pagine o访问网站.

Il container Servlet utilizza questo'interfaccia per creare una sessione di sessione tra un client HTTP e un server HTTP. La sessione dura per un periodo di tempo specificato, attraverso diverse connessioni o richieste di pagina.

Puoi ottenere l'oggetto HttpSession chiamando il metodo pubblico di HttpServletRequest getSession() per ottenere l'oggetto HttpSession, come segue:

HttpSession session = request.getSession();

Devi chiamare questo prima di inviare qualsiasi contenuto di documento al client request.getSession().Di seguito sono riassunti alcuni metodi importanti disponibili nell'oggetto HttpSession:

Numero di sequenzaMetodo & Descrizione
1public Object getAttribute(String name)
Il metodo restituisce l'oggetto con il nome specificato nella sessione di sessione; se non esiste un oggetto con il nome specificato, restituisce null.
2public Enumeration getAttributeNames()
Il metodo restituisce un oggetto Enumeration di Stringhe che contiene tutti i nomi degli oggetti associati a questa sessione di sessione.
3public long getCreationTime()
Questo metodo restituisce il tempo in millisecondi dal 1 gennaio 1970 alle 00:00:00 UTC alla creazione della sessione.
4public String getId()
Questo metodo restituisce una stringa che contiene l'identificatore unico assegnato alla sessione.
5public long getLastAccessedTime()
Questo metodo restituisce il tempo in millisecondi dal 1 gennaio 1970 alle 00:00:00 UTC alla ultima richiesta inviata dal client relativa a questa sessione.
6public int getMaxInactiveInterval()
Questo metodo restituisce l'intervallo massimo in secondi che il container Servlet mantiene aperta la sessione durante l'accesso del client.
7public void invalidate()
Questo metodo indica che la sessione è invalida e svincola qualsiasi oggetto associato a essa.
8public boolean isNew()
Questo metodo restituisce true se il client non conosce la sessione o se il cliente ha scelto di non partecipare alla sessione.
9public void removeAttribute(String name)
Questo metodo rimuove l'oggetto con il nome specificato dalla sessione.
10public void setAttribute(String name, Object value)
Questo metodo lega un oggetto con un nome specificato a questa sessione.
11public void setMaxInactiveInterval(int interval)
Questo metodo specifica il tempo tra le richieste client in secondi prima che il container Servlet indichi che la sessione è invalida.

Esempio di tracciamento sessione

Questo esempio spiega come utilizzare l'oggetto HttpSession per ottenere la data e l'ora di creazione della sessione e l'ora dell'ultimo accesso. Se non esiste una sessione, creeremo una nuova sessione tramite la richiesta.

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 /* Servlet implementazione classe SessionTrack
 */
@WebServlet("/SessionTrack")
public class SessionTrack extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // Se non esiste una sessione sessione, creare un oggetto sessione
        HttpSession session = request.getSession(true);
        // Ottenere l'ora di creazione della sessione
        Date createTime = new Date(session.getCreationTime());
        // Ottenere l'ora dell'ultima visita di questa pagina
        Date lastAccessTime = new Date(session.getLastAccessedTime());
         
        // Impostare il formato di output della data  
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    
        String title = "Servlet Session Esempio - Sito di Base Tutorial";
        Integer visitCount = new Integer(0);
        String visitCountKey = new String("visitCount");
        String userIDKey = new String("userID");
        String userID = new String("w3codebox");
        if(session.getAttribute(visitCountKey) == null) {
            session.setAttribute(visitCountKey, new Integer(0));
        }
    
        // Controllare se ci sono nuovi visitatori nella pagina web
        if (session.isNew()) {
            title = "Esempio Servlet Sessione - Sito di base tutorial";
             session.setAttribute(userIDKey, userID);
        }
             visitCount = (Integer)session.getAttribute(visitCountKey);
             visitCount = visitCount + 1;
             userID = (String)session.getAttribute(userIDKey);
        }
        session.setAttribute(visitCountKey, visitCount);
    
        // Impostare il tipo di contenuto della risposta
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
    
        String docType = "<!DOCTYPE html>\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\">Informazioni di sessione</h2>\n"
                "<table border=\"1\" align=\"center\">\n"
                "<tr bgcolor=\"#949494\">\n"
                "		<th>Informazioni di sessione</th><th>Valore</th></tr>\n"
                "    <tr>\n" +
                "		<td>id</td>\n"
                "    <td>" + session.getId() + "</td></tr>\n" +
                "    <tr>\n" +
                "    <td>Creazione</td>\n" +
                "    <td>" + df.format(createTime) + 
                "    </td></tr>\n" +
                "    <tr>\n" +
                "    <td>Ultimo accesso</td>\n" +
                "    <td>" + df.format(lastAccessTime) + 
                "    </td></tr>\n" +
                "    <tr>\n" +
                "    <td>ID utente</td>\n" +
                "    <td>" + userID + 
                "    </td></tr>\n" +
                "    <tr>\n" +
                "    <td>Statistiche di accesso:</td>\n" +
                "    <td>" + visitCount + "</td></tr>\n" +
                "</table>\n" +
                "</body></html>"); 
    }
}

Compila il seguente Servlet SessionTrackE crea una voce appropriata nel file web.xml.

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet> 
    <!-- Nome della classe -->  
    <servlet-name>SessionTrack</servlet-name>
    <!-- Pacchetto in cui si trova -->
    <servlet-class>com.w3codebox.test.SessionTrack</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SessionTrack</servlet-name>
    <!-- Indirizzo visitato -->
    <url-pattern>/TomcatTest/SessionTrack</url-pattern>
  </servlet-mapping>
</web-app>

Inserisci nell'area di indirizzo del browser: http://localhost:8080/TomcatTest/SessionTrackQuando esegui per la prima volta, mostrerà il seguente risultato:

Riprovare a eseguire lo stesso Servlet, mostrerà il seguente risultato:

Elimina i dati di sessione di Sessione

Quando hai completato i dati di sessione di un utente, hai diverse opzioni:

  • Rimuovi un attributo specifico:Puoi chiamare public void removeAttribute(String name) Metodo per eliminare il valore associato a una chiave specifica.

  • Elimina l'intera sessione di sessione:Puoi chiamare public void invalidate() public void invalidate()

  • metodo per eliminare l'intera sessione di sessione.Puoi chiamare public void setMaxInactiveInterval(int interval) metodo per impostare il tempo di scadenza della sessione di sessione singolarmente.

  • Disconnettere l'utente:Se stai usando un server che supporta servlet 2.4, puoi chiamare logout Per disconnettere i client dal server Web e invalidare tutte le sessioni di sessione degli utenti.

  • Configurazione web.xml:Se stai usando Tomcat, oltre al metodo sopra menzionato, puoi configurare il tempo di scadenza della sessione di sessione nel file web.xml come segue:

  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

Il tempo di scadenza dell'esempio sopra è espresso in minuti e sovrascriverà il tempo di scadenza predefinito di 30 minuti in Tomcat.

Il metodo getMaxInactiveInterval() in un Servlet restituisce il tempo di scadenza della sessione di sessione in secondi. Pertanto, se il tempo di scadenza della sessione di sessione è configurato a 15 minuti nel web.xml, getMaxInactiveInterval() restituirà 900.