Newsgroup: it.comp.lang.javascript
Titolo: unload e logout

Ciao a tutti,
In un applicazione che sto scrivendo ho la necessit� che quando l'utente 
chiude il browser, questi dovrebbe fare un ultima chiamata ajax alla 
pagina di logout in modo da eliminare la sessione dell'utente.
Ho risolto usando jquery:
$(window).unload( function () {
// Alla chiusura chiamo il logout
	ajaxLogout();
});
ajaxLogout non fa altro che chiamare la pagina di logout e tutto 
funziona alla grande. Purtroppo per� ho lo stesso comportamento quando 
l'utente fa il refresh della pagina (F5).
Come posso evitare questo side-effect?
Grazie mille
-- 
g4b0, linux user n. 369000
http://brosulo.net

 Come posso evitare questo side-effect?
a naso non puoi.

 Come posso evitare questo side-effect?
Non puoi. HTTP e` stateless. Ogni pagina e` un mondo a se`.
Devi controllare, magari lato server, se l'utente va in un'altra pagina 
del sito o se e` proprio uscito del tutto.
Bye.

 Non puoi. HTTP e` stateless. Ogni pagina e` un mondo a se`.
Non hai capito la domanda: nella singola pagina HTML vorrei scindere 
l'evento di chiusura del browser dall'evento di refresh.
Per intenderci il codice:
$(window).unload( function () {
// Alla chiusura chiamo il logout
	aler('ciao');
});
mi dovrebbe scrivere ciao solo quando chiudo il browser e non quando 
faccio F5.
Si può?


 a naso non puoi.
dai, che una soluzione la si trova..


 l'evento di chiusura del browser dall'evento di refresh.
Si`, l'ho capita, ma non esiste un "evento di refresh".
Il refresh sono due eventi: unload della pagina corrente e load di una 
pagina nuova.
Per quello non puoi fare niente.
E il load della nuova pagina ripulisce tutto lo stato.
Forse qualcosa lo puoi fare impazzendo un pochino: sull'unload mandi al 
server un messaggio "tra 30 secondi cancella la sessione", poi setti un 
cookie in locale. Nella stessa pagina, al load, leggi il cookie. Se e` 
settato meno di 30 secondi fa, mandi un messaggio al server "ehi! 
dimenticati quel messaggio di prima e mantieni la sessione!"
Bye.


Questa è un'ottima idea! Posso usare un ajax asincrono alla chiusura 
della pagina in cui setto la variabile, mentre al reload la unsetto 
(scusa l'inglesismo). Nel frattempo il php oggetto dell'ajax asincrono è 
in sleep e quando si sveglia verifica la variabile. Se è settata fa il 
logout, altrimenti non fa nulla!
Ti faccio sapere!!


 logout, altrimenti non fa nulla!
Ci ho provato, ma purtroppo non funziona. Il fatto è che al reload (F5) 
la pagina si aggiorna prima che arrivi la chiamata ajax, quindi non 
riesco a gestire la variabile di sessione condivisa, neanche 
introducendo dei delay.
Possibile che mai nessuno abbia avuto una necessità simile?


 Possibile che mai nessuno abbia avuto una necessità simile?
C'e' anche chi ha sentito la necessita' di impedire all'utente,
attraverso javascript, di chiudere il browser:
http://forums.devarticles.com/javascript-development-22/how-to-stop-browser-from-closing-using-javascript-8458.html
Se un cliente chiede una feature simile, la prima risposta che viene in
mente, giustamente, e' un bel "non si puo' fare" - che a volte significa
anche "si puo' fare ma e' un casino".

 anche "si puo' fare ma e' un casino".
Non sono d'accordo.
Ossia: se è solo una feature "di comodo", dove ben sai che comunque è 
aggirabile, allora ok, se il cliente insiste si crea un accrocchio.
Ma se la richiesta deve funzionare sempre, altrimenti la logica che ci 
sta dietro salta, allora la risposta è e deve essere "non si può fare".
Se non ho capito male, l'OP vorrebbe trovare un metodo *CERTO* per 
eliminare la session dell'utente, lavorando però client-side. Risposta: 
non si può fare.
Mi ripeto (vale sia per questa richiesta, sia p.e. per cercare di non far 
chiudere il browser all'utente):


 non si può fare.
Non è proprio così. Ho bisogno di un metodo "abbastanza sicuro" per 
eliminare la sessione. Spiego il motivo:
C'è un applicazione flash sviluppata da terze parti (un gioco) che sfida 
  un'altro utente a giocare. Lo sfida sulla base dello username che 
legge da un elenco fornito dal server php. Allo stesso modo ciascun 
utente mantiene nella propria sessione il suo username, in modo da 
sapere quando una sfida gli appartiene e rispondere.
Il problema è non permettere allo stesso username di fare login due 
volte, altrimenti in caso di sfida risponderebbero in due. Faccio quindi 
un controllo se l'untente è già collegato e non lo lascio accedere. E 
questo funziona.
Ma se l'utente chiude *PER ERRORE* il browser deve aspettare lo scadere 
della sessione per poter riaccedere. Vorrei evitare questo. Se gli va 
via la corrente, pazienza. Se gli esplode il computer pazienza. Questo 
caso mi coprirebbe il 99.99% delle situazioni, gli altri aspettano 20 
minuti e giocano di nuovo.
Ho quasi risolto con 2 chiamate ajax ASINCRONE, una al caricamento della 
pagina ed una all'unload, ma non riesco a sincronizzare le tempistiche..
Al load della pagina l'ajax setta la variabile di sessione a 0.
All'unload il secondo ajax setta la variabile a 1, sleep per 10sec, 
check della variabile: se == 1 faccio logout, altrimenti niente.
Il problema è che facendo il refresh della pagina parte l'ajax 
dell'unload e si mette in sleep, la pagina si refresha, ma ASPETTA che 
termini l'ajax precedente prima di lanciare quello del load, quindi vado 
in logout!!
Credo che si tratti di un problema di firefox, ma non ne sono così 
sicuro.. Se non sono stato chiaro posso postare un po' di codice, tanto 
si tratta di poche righe...
Grazie mille per l'interessamento


 eliminare la sessione. 
Te la sparo:
 a) la Session scade a breve (es. 1 minuto)
 b) nella pagina metti una chiamata ajax trasparente che ogni 30 secondi 
invia una richiesta a una pagina server-side, che altro non fa se non 
risettare la data di scadenza del cookie (ovviamente la stessa procedura 
la fa quando ricarichi la pagina)
 c) se entro 1 minuto non arriva la chiamata la session scade.
Così ho invertito i passaggi: non "avvisami quando non ci sei più" ma 
"avvisami se ci sei ancora".
Cosa ne pensi?


Ci pensavo anche io alla session breve, tanto ci sono già delle chiamate 
temporizzate a 2sec che verificano se c'è l'invito a giocare. Il 
problema che dovrò affrontare è quanto appesantiranno il server tutte 
queste chiamate...
Il problema è quando entrano dentro a delle applicazioni flash da 
giocare singloarmente, le quali fanno una chiamata alla partenza ed una 
all'uscita, per segnalare il punteggio. Durante il gioco scadrebbe la 
sessione...


 sessione...
Beh, ma flash sarà dentro una finestra del browser (dove puoi metterci le 
chiamate asincrone) ... o no?

 sta dietro salta, allora la risposta è e deve essere "non si può fare".
Era esattamente l'intento della mia risposta. Siamo d'accordo


In effetti si, ma vorrei limitare il carico al server, dato che in 
teoria questo sito dovrà sopportare un bacino di utenza decisamente ampio...
Tra l'altro, parlando di carico del server, siamo OT se discutiamo di 
quanto sovraccarica il fatto di avere delle chiamate ajax temporizzate 
diciamo a 2 secondi?
Può saturarsi il numero di connessioni del server? Potrebbe andare in 
palla la CPU? Ho già limitato drasticamente le query al DB usando la 
shared memory...


 Può saturarsi il numero di connessioni del server?
Certo