18 messaggi dal 05 settembre 2003
ciao a tutti ragazzi

ho inserito lo script qui sotto ma non funziona. Ho fatto il global.asa, nella pagina di autenticazione ho inserito il codice ma il + delle volte, quando apro la pagina dove la variabile di applicazione viene spittata e restituisce i nomi degli utenti che si sono loggati e sono attualmente on line, il risultato è il seguente:

andrealucagiovannialfredo

mentre dovrebbe essere
andrea
luca
giovanni
alfredo

la mia deduzione è stata che nella variabile di applicazione non venga inserito il carattere | che serve a delimitare il valore delle variabili di sessione memorizzate nella var di applicazione.
il risultato è che se andrea o luca ecc si slogano il loro nome rimane li toppato nella variabile di applicazione in quanto nel global.asa all'evento session on end, il valore nella variabile di applicazione non viene tolto perchè è diverso dalla var di sessione che scade con il nome del loggato.

Sarò stato chiaro? bho
grazie raga per l'aiuto


script scaricato da aspitalia:

<SCRIPT language="VBScript" Runat="Server">

Sub Application_OnStart
Application("Users") = ""
End Sub

Sub Session_OnEnd

Application.Lock
Application("Users") = Replace( Application("Users") , Session("utente") & "|" ,"")
'quando scade una sessione viene eliminato il nome dell'utente dalla variabile di
'applicazione che contiene l'elenco degli utenti attivi
Application.UnLock

End Sub

</SCRIPT>
Inoltre, nella pagina che controlla utente e password, ovvero la pagina di autenticazione, bisognerà aggiungere una routine che aggiunga alla variabile di Applicazione l'utente appena autenticato:

<%

Session("utente") = Request("Utente")
if InStr(1, Application("Users"), Session("utente") & "|" ) = 0 then
'se l'utente non è già presente
Application.Lock
'viene aggiunto l'utente appena loggato alla stringa che contiene
' l'elenco degli utenti
Application("Users") = Application("Users") & Session("utente") & "|"
Application.UnLock
end if

%>
Infine, per mostrare la lista degli utenti loggati basterà tramutare la variabile Application "Users" in una array splittandola per il carattere "|":

<%

dim arrUtenti
Response.Write "<b>Utenti Collegati:</b><br>"
arrUtenti = Split(Application("Users"),"|")

for i = 0 to UBound(arrUtenti)
Response.Write arrUtenti(i) & "<br>"
next

%>
879 messaggi dal 09 luglio 2002
www.i-studio.it
Che significa "il + delle volte"? Vuoi dire che questo errore non e' costante? Ho visto il codice e mi sembra giusto... non vedo come mai a volte la cosa funziona e a volte no...
Prova a fare in questo modo: dopo che un utente e' entrato nel sito, stampa sempre il contenuto della variabile Application("users") e vedi se contiene sempre il nome di alcuni utenti seguito dal carattere "|".

Ciao
Alex

Internetworking Studio Srl
www.i-studio.it
18 messaggi dal 05 settembre 2003
ciao alex
è proprio cosi il + delle volte

ho provato a printare la var di applicazione

alle vote c'è andrea|luca| ecc
ed è tutto ok uno si slogga e ciao

molte altre volte c'è andrealucaecc

l'unico modo x resettare è ributtare in root il global.asa
18 messaggi dal 05 settembre 2003
sono sempre io in aggiunta alla risposta ad alex:

secondo me il primo che si logga, poi chiude il browser, la session non scade e si incasina quando un altro si logga :-(

grazie alex

vostok3
879 messaggi dal 09 luglio 2002
www.i-studio.it
Sicuramente, l'evento Session_Onend non scatta esattamente quando l'utente chiude il browser o quando scade la sessione... quindi, ti suggerirei di mettere il codice per il "logout" in una pagina che chiami o espressamente quando l'utente clicca un bottone "logout" oppure quando ti accorgi che "esce" dal tuo sito. Per quest'ultimo evento, dovresti avere una struttura a frames e gestire l'evento JavaSCript onunload della finestra principale.

Per quanto riguarda il tuo codice, e' un mistero... perche' immaginiamo come funziona il sistema al momento t=0 (cioe' proprio quando attivi il sito).
1) entra un nuovo utente (diciamo "Mario").
2) il sistema entra nell'IF perche' non trova questo utente e quindi aggiunge alla var Application("users") la stringa "Mario|".
3) anche se Mario chiude il browser, spegne il computer, fa cadere la sessione o fa qualunque altra cosa, quando entra un altro utente il sistema comunque dovrebbe aggiungere la nuova stringa a quella esistente e quindi dovresti avere (per il nuovo utente "Luca") "Mario|Luca|" oppure "Luca|"...

Quello che voglio dire e' che il codice che usi per aggiungere il nome utente e il carattere "|" e' semplice... non c'e' nulla di strano...
Non e' che da qualche altra parte usi questa var di Application per fare altre cose?
Hai fatto un controllo?

Ciao
Alex

Internetworking Studio Srl
www.i-studio.it
879 messaggi dal 09 luglio 2002
www.i-studio.it
Forse ho capito!!!
Allora, il problema e' nel global.asa. Tu hai scritto questa cosa:
...
Sub Session_OnEnd 
...
Application("Users") = Replace( Application("Users") , Session("utente") & "|" ,"") 
...
End Sub 
...

cioe', dici all'ASP di sostituire all'interno della var di Application la stringa composta dalla Session("utente") piu' il carattere "|" con nulla. Ma il problema e' che questo evento scatta quando la sessione scade e quindi a quel punto tutte le variabili di Sessione sono state distrutte. Quindi, quello che si trova a fare ASP e' sostituire il carattere "|" con nulla ed e' per questo motivo che la var Application("users") diventa una sequenza di nomi utente senza il carattere "|".
Oltretutto ti basta che questa cosa avvenga una sola volta per "eliminare" tutti i caratteri "|" dal var di Application, perche' la funziona Replace lavora in modo ricorsivo...

Ciao
Alex

Internetworking Studio Srl
www.i-studio.it
18 messaggi dal 05 settembre 2003
in che senso scadono tutte le var di sessione?

on end quando scade la mia var e quindi tolgo il mio nome dalla var di applicazione. ma se al sito è collegato "giovanni" e ci sta navigando la sua var di sessione è attiva...

io il log out l'ho fatto... ma nesuno lo usa ovvio!

forse l'unica è creare una paginetta micro che fa il session.abadon legata all'evento on end della pagina.

forse inserire anche il codice che toglie il nome dalla var di applicazione users andrebbe meglio che il session_on end del global.asa

oppure nel global.asa l'evento session on end deve fare in modo che la var di sessione abbia ancora il nome dell'utente che se ne è andato cosi da risolvere il problema che hai evidenziato nella tua ultima risposta

cosa dici?
ciao
879 messaggi dal 09 luglio 2002
www.i-studio.it
Il problema e' che l'evento Session_OnEnd scatta quando la sessione di un certo utente scade; ma se scade, significa che in quel momento automaticamente si annullano tutte le variabili di sessione, compresa quella che usi tu nel codice per fare la replace....

Secondo me, la cosa migliore e' affidarsi ad una paginetta che fa il "logout" da codice, sperando che le persone cliccano il bottone!!

Se invece vuoi seguire la strada della pagina lanciata in automatico all'uscita dal sito, come ti dicevo dovresti usare una struttura a frames, perche' devi usare l'evento "onunload" della pagina che pero' si attiva anche se passi da una pagina all'altra del tuo sito...

Se vuoi seguire quella strada e hai bisogno di una mano, fammelo sapere.

Ciao
Alex

Internetworking Studio Srl
www.i-studio.it

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.