- ASP .Net Session: configurazione e uso -
 
COSA SERVE PER QUESTO TUTORIAL
 Download | Chiedi sul FORUM | Glossario conoscenza dell'HTML - un web server che supporti la tecnologia ASP .NET
Le sessioni in ASP .Net: un login e come configurarle

UN LOGIN CON SESSIONE
Un semplice esempio di utilizzo delle sessioni: un form di login

Una delle maggiori necessità di chi programma su web è indubbiamente quella di superare l'ostacolo del fatto che HTTP è un protocollo state-less, ovvero in cui ogni richiesta è considerata singola e indipendente. Entra così in gioco il concetto di sessione, che nella sua forma più semplice indica un lasso di tempo che inizia all'arrivo di un utente su una qualunque pagina ASP .Net e termina con la sua dipartita dal sito. Ad una sessione è possibile associare una serie di dati riguardanti un singolo utente, accessibili per tutta la durata della sessione da qualunque pagina.
Vediamo subito un esempio per capire: una semplice pagina di login e una di conferma di login avvenuto. Di seguito login.aspx:


<%@ Page Language="VB" %>

<script language="VB" runat="server">
    Sub Page_Load(obj As Object, e As EventArgs)
        If Request("user") = "Carlo" And Request("pass") = "segreta" Then
            Session("user") = Request("user")
            Response.Redirect("conferma.aspx")
        End If
    End Sub
</script>

<form action="login.aspx">
    Nome utente: <br> 
    <input type="text" name="user" value="Carlo"> <br> 
    Password: <br> 
    <input type="password" name="pass" value="segreta"> <br> 
    <input type="submit" value="Login!">
</form>

e conferma.aspx:


<%@ Page Language="VB" %>

Login effettuato con successo! <br>
Bentornato <% =Session("user") %>

Come si può vedere l'utilizzo delle sessioni è davvero semplice: per impostare un valore è sufficiente utilizzare la sintassi

Session("identificativo") = Valore

e in seguito per richiamarlo (anche in un'altra pagina)

Response.Write(Session("identificativo"))

Si badi che Valore non deve per forza essere una stringa come nell'esempio sopra, ma può essere un qualsiasi oggetto. Session è un oggetto che fa parte del contesto della pagina, e quindi accessibile sempre senza problemi, di tipo System.Web.SessionState.HttpSessionState.
Normalmente la sessione rimane aperta fino allo scadere di un timeout di inattività, ma se per qualunque motivo si desidera interromperla volontariamente, tipicamente per una richiesta di logout da parte dell'utente, basta utilizzare il metodo Abandon:

Session.Abandon()

Richiamare questo metodo cancellerà tutti i dati memorizzati e farà terminare la sessione.

CONFIGURAZIONE DELLE SESSIONI IN ASP.NET
Timeout, sessioni cookieless e locazione dei dati memorizzati

Ma se HTTP è un protocollo state-less, come si può determinare se una richiesta proviene da uno stesso utente? Uno dei metodi è quello di modificare gli URL di tutto il sito aggiungendo un identificativo univoco della sessione (ad esempio http://www.arcadiaclub.com/id{idUnivocoAlfaNumerico239}/pagina.aspx, oppure http://www.arcadiaclub.com/pagina.aspx?session=idUnivocoAlfaNumerico239), ma, nonostante ASP .Net permetta di applicare questo metodo senza troppa fatica, la sua adozione è fortemente sconsigliabile per via dei problemi che riguardano i link, i quali vengono riscritti automaticamente (e spesso in maniera imprecisa) da ASP .Net.
L'alternativa più comunemente adottata è quella dell'uso dei cookie, ormai accettati senza problemi dalla stragrande maggioranza degli utenti del web. In questo caso gli URL rimarranno intatti ma verrà aggiunto un cookie in genere chiamato ASP.NET_SessionId ma personalizzabile tramite web.config. Vediamo dunque la voce del file di configurazione che riguarda le sessioni:


<configuration>
    <system.web>
        <sessionState 
            timeout="20"
            cookieName="ASP.NET_SessionId"
            cookieless="[true|false|AutoDetect|UseCookies|UseUri]"
            mode="[Off|InProc|StateServer|SQLServer|Custom]"
        />
    </system.web>
</configuration>

Nota: sono stati qui riportati solamente gli attributi più utili e frequentemente usati.
La voce riguardante le sessioni è sessionState: per prima cosa notiamo che va posizionata all'interno dell'elemento system.web, a sua volta contenuto in configuration.
L'attributo timeout indica il numero di minuti di inattività dell'utente dopo i quali la sessione scadrà, ovvero verrà interrotta con la conseguente perdita di tutti i dati memorizzati; per tempo di inattività dell'utente si intende il tempo trascorso dall'ultima richiesta HTTP (in sostanza dall'ultima richiesta di una pagina) compiuta dall'utente. Ogni volta che l'utente richiede una pagina al server il conteggio del timeout viene azzerato. È possibile impostare il timeout di sessione anche via codice tramite la proprietà Timeout dell'oggetto Session:

Session.Timeout = 20 'Tempo in minuti

L'attributo cookieName permette di impostare il nome del cookie sotto il quale sarà memorizzato l'identificativo della sessione.
L'attributo cookieless permette di impostare se utilizzare gli URL per identificare una sessione (valori true e UseUri), i cookie (valori false e UseCookies) oppure rilevare automaticamente se il browser supporta o meno i cookie (valore AutoDetect).
L'attributo mode permette di impostare dove devono risiedere i dati memorizzati per le sessioni: off disabilità le sessioni, InProc usa l'area di memoria del processo di ASP .Net, Custom specifica che si utilizzerà un provider di sessioni personalizzato, StateServer che sarà utilizzato un servizio ASP .Net esterno e infine SQLServer che i dati saranno memorizzati su un server SQL. Per specificare ulteriori dettagli a riguardo delle ultime due modalità vi sono altri attributi, che non sono oggetto di discussione in questo articolo. La modalità InProc è la più utilizzata ma in caso di arresto del processo ASP .Net per una qualsiasi ragione (ad esempio per il riavvio del server) tutti i dati vengono persi: ciò non accade invece ad esempio se si utilizza un server SQL per memorizzare i dati di sessione.
 

<< INDIETRO by VeNoM00