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

Sessione JSP

HTTP è un protocollo senza stato, il che significa che ogni volta che il client recupera una pagina web, deve aprire una connessione di server separata, di conseguenza il server non registra alcuna informazione sulla richiesta del client precedente.

Ci sono tre metodi per mantenere la sessione tra il client e il server:

    Cookies

Un server di rete può specificare un ID di sessione univoco come cookie per rappresentare ogni client, utilizzato per identificare la successiva richiesta del client.

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

    Campo di form nascosto

Un server di rete può inviare un campo di form HTML nascosto e un ID di sessione univoco, come nel seguente esempio:

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

Questo elemento significa che quando viene inviato il modulo, il nome e il valore specificati verranno automaticamente inclusi nei dati GET o POST. Ogni volta che il browser invia una richiesta, il valore di session_id può essere utilizzato per salvare le tracce di diversi browser.

Questo metodo potrebbe essere un modo efficace, ma non viene generato un evento di submit del modulo quando si fa clic su un tag <A HREF>, quindi non viene supportato il tracciamento delle sessioni nascoste.

    Riscrittura dell'URL

Puoi aggiungere dati aggiuntivi alla fine di ogni URL per distinguere le sessioni, il server può associare l'identificatore di sessione in base a questi dati.

Per esempio, http://oldtoolbag.com/file.htm;sessionid=12345, il identificatore di sessione è sessionid=12345, il server può utilizzare questi dati per identificare il client.

In confronto, è meglio ricorrere alla riscrittura dell'URL, anche se il browser non supporta i cookies può funzionare, ma il difetto è che è necessario specificare dinamicamente l'ID di sessione per ogni URL, anche se è una pagina HTML semplice.

    Oggetto sessione

Oltre ai metodi menzionati, il JSP utilizza l'interfaccia HttpSession fornita dal servlet per identificare un utente, memorizzare tutte le informazioni di accesso dell'utente.

Per impostazione predefinita, il JSP consente il tracciamento delle sessioni, un nuovo oggetto HttpSession viene automaticamente istanziato per ogni nuovo esempio di client. Per disabilitare il tracciamento delle sessioni è necessario disattivarlo esplicitamente, impostando il valore dell'attributo sessione dell'instruzione page su false, come nel seguente esempio:

<%@ page session="false" %>

Il motore JSP esponga implicitamente l'oggetto sessione ai sviluppatori. Poiché è fornito l'oggetto sessione, i sviluppatori possono memorizzare o recuperare dati in modo conveniente.

La tabella seguente elenca alcuni metodi importanti dell'oggetto sessione:

S.N.Metodo & Descrizione
                1public Object getAttribute(String name) Restituisce l'oggetto associato al nome specificato nell'oggetto sessione, se non esiste restituisce null
                2public Enumeration getAttributeNames() Restituisce tutti i nomi degli oggetti nell'oggetto sessione
                3public long getCreationTime() Restituisce il tempo di creazione dell'oggetto sessione, in millisecondi, a partire dalle 00:00 del 1 gennaio 1970
                4public String getId() 返回session对象的ID
                5public long getLastAccessedTime() 返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起
                6public int getMaxInactiveInterval() 返回最大时间间隔,以秒为单位,servlet 容器将会在这段时间内保持会话打开
                7public void invalidate() 将session无效化,解绑任何与该session绑定的对象
                8public boolean isNew() 返回是否为一个新的客户端,或者客户端是否拒绝加入session
                9public void removeAttribute(String name) 移除session中指定名称的对象
                10public void setAttribute(String name, Object value)  使用指定的名称和值来产生一个对象并绑定到session中
                11public void setMaxInactiveInterval(int interval) 用于指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效

JSP Session应用

此实例描述了如何使用HttpSession对象来获取创建时间和最后一次访问时间。我们将会为request对象关联一个新的session对象,如果这个对象尚未存在的话。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<%
   // 获取session创建时间
   Date createTime = new Date(session.getCreationTime());
   // 获取最后访问页面的时间
   Date lastAccessTime = new Date(session.getLastAccessedTime());
   String title = "再次访问基础教程网示例";
   Integer visitCount = new Integer(0);
   String visitCountKey = new String("visitCount");
   String userIDKey = new String("userID");
   String userID = new String("ABCD");
   // Verifica se la pagina ha nuovi utenti che accedono
   if (session.isNew()){
      title = "Accesso al sito di esempio di tutorial base";
      session.setAttribute(userIDKey, userID);
      session.setAttribute(visitCountKey,  visitCount);
   } else {
       visitCount = (Integer)session.getAttribute(visitCountKey);
       visitCount += 1;
       userID = (String)session.getAttribute(userIDKey);
       session.setAttribute(visitCountKey,  visitCount);
   }
%>
<html>
<head>
<title>Tracciamento sessione</title>
</head>
<body>
<h1>Tracciamento sessione</h1>
<table border="1" align="center"> 
<tr bgcolor="#949494">
   <th>Informazioni di sessione</th>
   <th>Valore</th>
</tr> 
<tr>
   <td>id</td>
   <td><% out.print( session.getId()); %></td>
</tr> 
<tr>
   <td>Creazione</td>
   <td><% out.print(createTime); %></td>
</tr> 
<tr>
   <td>Ultimo accesso</td>
   <td><% out.print(lastAccessTime); %></td>
</tr> 
<tr>
   <td>ID utente</td>
   <td><% out.print(userID); %></td>
</tr> 
<tr>
   <td>Numero di accessi</td>
   <td><% out.print(visitCount); %></td>
</tr> 
</table> 
</body>
</html>

Prova ad accedere http://localhost:8080/testjsp/main.jsp ,La prima volta che viene eseguito, verrà ottenuto il seguente risultato:

Durante un nuovo accesso, si otterrà il seguente risultato:

Eliminazione dei dati di sessione

Dopo aver elaborato i dati di sessione di un utente, è possibile fare la seguente scelta:

  • Rimozione di un attributo specifico:

    Chiamare il metodo public void removeAttribute(String name) per rimuovere l'attributo specificato.

  • Eliminazione dell'intera sessione:

    Chiamare il metodo public void invalidate() per rendere non valida l'intera sessione.

  • Impostazione della durata della sessione:

    Chiamare il metodo public void setMaxInactiveInterval(int interval) per impostare il timeout della sessione.

  • Disconnessione utente:

    I server che supportano la versione 2.4 del servlet possono chiamare il metodo logout() per disconnettere l'utente e rendere tutte le sessioni correlate non valide.

  • Configurazione del file web.xml:

    Se si utilizza Tomcat, è possibile configurare il file web.xml come segue:

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

Il timeout è espresso in minuti, il tempo di scadenza predefinito in Tomcat è di 30 minuti.

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