Session e chiusura browser

venerdì 20 novembre 2009 - 17.50

rubensoda72 Profilo | Newbie

Salve.

Premetto, sono alle prime armi con asp.net e sto sviluppando un'applicazione in asp.net 2.0 con db firebird 2.1.3
nel mio web.config lo stato della sessione è così gestito :
<sessionState mode="InProc" timeout="1" cookieless="false"/>
(1 min per eseguire verifiche)
L' autenticazione avviene tramite database.

Quando un utente esegue l' autenticazione eseguo le seguenti operazioni:
1.Scrivo nella tabella "utenti" quanto segue relativamente all'utente che si è autenticato (tramite campo identificatore id_utenti):
sessione_attiva = 1 e session_id = Session.SessionID
2.Scrivo nella tabella "sessioni" quanto segue:
session_id = Session.SessionID,id_utenti = id dell'utente, client_ip=ip del client,inizio_sessione=data/ora autenticazione,fine_sessione = null
3.Uso 2 variabili di sessione per memorizzare l'id_utenti e la sessionId : Session("id_utenti") = id dell'utente,Session("session_id")=Session.SessionID

la tabella utenti mi serve per tener traccia di chi è autenticato ed impedire doppi login
la tabella sessioni mi serve per motivi interni (log management)

Alla pressione del Logout avviene quanto segue:

1. tabella "utenti" : sessione_attiva = 0 e session_id = null
2. tabella "sessioni" : fine_sessione = data/ora logout
3. Session.Remove("id_utenti") e Session.Remove("session_id")
4. Session.Abandon (è corretto??)

La scadenza della session (nel aso in cui non si prema il pulsante di logout) la gestisco tramite session_end nel global.asax facendo eseguire le operazioni 1 e 2 del logout viste sopra
(lo so, ne consegue che le stesse operazioni vengono eseguite due volte (session.abandon "scatena" Session_End)..non ho trovato altro modo..)

Finalmente la domanda più inflazionata del Web..
Come gestire la chiusura del browser da parte dell'utente ??
So che la session non scade alla chiusura del browser ma alla fine del timeout.
Vorrei poter aggiornare le mie due tabelle "utenti" e "sessioni" come visto sopra cioè:
riportare il flag di sessione_attiva a 0 e "chiudere" l'arco temporale di sessione assegnando data/ora al mio campo fine_sessione.
Ho letto di soluzioni lato server e client (Response.IsClientConnected,body onunload, ecc.) ma non mi hanno convinto.
Ho disperatamente cercato soluzioni tipo session spooler o qualcosa del genere..
Sono inesperto e in quanto tale avevo pensato si potesse in qualche modo "ciclare" ogni tot di tempo lato server su tutte le variabili
session("id_utenti") esistenti ed attive e confrontarne il valore con gli id_utenti nella tabella utenti in database.
Per tutti gli utenti in tabella per cui non è in "vita" una variabile di sessione corrispondente, riportare il flag sessione_attiva a 0 in caso
fosse a 1.
Non penso però si possa fare o meglio non ho trovato nulla sul web da cui la deduzione..

Spero di essermi spiegato correttamente.
Spero che inesattezze e lacune siano perdonate visto che ho iniziato da una ventina di giorni..
Avete suggerimenti ?

Grazie in anticipo!

Gabriele







FrancescoGuadagno Profilo | Senior Member

Ciao, quando ho avuto io un problema analogo risolsi con l'onunload, facendo un Redirect a un'altra pagina che quindi lato server si occupava di queste questioni.
Se non ti piace questa soluzione allora credo che tu sia proprio nei guai

TOPOAMORE Profilo | Expert

Ciao,
come ha anche detto AmadeusBA puoi gestire il tutto tramite unload della pagina che si scatena alla chiusare del browser per ovvi motivi e gestire l'update dei dati tramite redirect a una nuova pagine tramite ajax

facci sapere
ASP 2.0 - VB 2008

sankyu Profilo | Senior Member

una soluzione forse ce l'ho un po complessa ma dovrebbe andare
usa il global.asax ed imposta una variabile di tipo static C# o shared vb.net in cui listi tutte le sessioni che sono oggetti ed hanno uno stato potresti creare una classe tipo
sessioneUtente che contiene il sessionID e un booleano che indica se attiva o no

poi ogni volta che un'utente fa una richiesta nella pagina web tu controlli che tutte le sessioni siano attive e ne aggiorni lo stato

domani magari mi spiego meglio ora ho sonno!

FrancescoGuadagno Profilo | Senior Member

>una soluzione forse ce l'ho un po complessa ma dovrebbe andare
>usa il global.asax ed imposta una variabile di tipo static C#
>o shared vb.net in cui listi tutte le sessioni che sono oggetti
>ed hanno uno stato potresti creare una classe tipo
>sessioneUtente che contiene il sessionID e un booleano che indica
>se attiva o no
>
>poi ogni volta che un'utente fa una richiesta nella pagina web
>tu controlli che tutte le sessioni siano attive e ne aggiorni
>lo stato
>
>domani magari mi spiego meglio ora ho sonno!

Così però non riesci comunque a gestire il session end di un utente che scatta, nel global.asax, per assurdo 20 minuti dopo che l'utente ha già chiuso il suo browser...
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5