Un problema che spesso si presenta, quando si vuole tenere sotto controllo il numero di utenti online sul proprio sito, è rilevare se l'utente è uscito dal nostro sito chiudendo direttamente il Browser.
Non esiste infatti un modo per rilevare l'evento che l'utente abbia abbandonato il nostro sito portandosi su un altro sito, oppure che l'utente sia uscito chiudendo direttamente il Browser.
Vi presento quindi una soluzione a questo problema, realizzata con ASP ed Ajax.
Per prima cosa vi spiego la teoria, poi vi illustro il codice (molto semplice). Se qualcuno volesse saltare la spiegazione, in fondo trovate lo zip con gli script.
Io ho risolto il problema prendendolo al contrario: non sono io che devo vedere se l'utente è online..o se è uscito...o se ha cambiato sito... Ma è l'utente che deve segnalarmi di essere ancora sul mio sito.
Quindi ogni tot minuti, secondi o quello che vorremo, il nostro utente, con una richiesta asincrona fatta con ajax, comunicherà al nostro server, di essere ancora sul sito. E quando segnala la sua presenza, mi salverò il minuto della sua segnalazione....a questo punto, se l'ultima segnalazione di un utente dovesse essere più vecchia del numero di minuti che io imposto, elimino semplicemente l'utente dalla mia variabile che contiene gli utenti reali sul sito.
TEORICAMENTE IL GIOCO FINISCE QUI!
Ovviamente, tra il dire ed il fare...
La prima operazione, è quella tipica di creare la variabile "application", che conterrà le informazioni che mi interessano sugli utenti online.
La variabile Application (che per chi non lo sapesse, è una variabile comune a tutti gli utenti, e che rimane attiva finchè tutti gli utenti non sono usciti dal mio sito), viene in genere creata o nel global.asa (nell'ASP (il global.asa è il primo file che viene letto all'entrata sul sito)), oppure possiamo decidere di crearla dove e come vogliamo. Io in questo esempio la variabile application, che chiamerò "utenti", la creo quando un utente registrato del mio sito effettua il Login.(volendo si può creare prima ancora, tenendo come riferimento per l'utente la sua sessionID)
Nell'esempio creeremo un sistema generico che conta tutti gli utenti entrati sul sito, non solo quelli che effettuano il login, quindi terremo come punto di riferimento la sessionID dell'utente. La sessionID è una variabile session, che viene creata automaticamente dal server, ogni volta che entra un utente, è univoca e dura per tutto il tempo che l'utente gira sul nostro sito. Questa variabile puù essere utile ad esempio, in siti ecommerce, per riempire il carrello temporaneo, senza che l'utente si sia ancora registrato o abbia effettuato il login.
Per prima cosa dobbiamo creare la variabile application, se non esiste ancora, oppure accodarci alla variabile già esistente:
Per il codice di questa prima parte, aprire il file "test.asp", all'interno dello Zip.
Il risultato sostanzialmente sarà un array con "SessionID---minuto della segnalazione della propria presenza o della propria entrata"
A questo punto, in ogni pagina del mio sito, avrò un piccolo script, che tramite l'oggetto XMLHttpRequest, che è la base per le richieste asincrone di Ajax, che con un intervallo fissato da noi, segnalerà la nostra presenza, ed andrà ad aggiornare l'orario nella variabile application.
Nella pagina test.asp, trovate il codice Ajax che aggiorna la nostra presenza, richiamando la pagina "presenza.asp", e che legge l'elenco attuale degli utenti dalla pagina "utenti-online.asp".
La tabella degli utenti online viene poi inserita, sempre con una richiesta asincrona, nella pagina test.
Nella pagina "utenti-online.asp", che è la pagina che mi conta gli utenti, e che mi genera l'elenco, ho lo script che controlla se gli utenti presenti nella variabile application, hanno segnalato la loro presenza negli ultimi n minuti, che ho impostato.
Se ho impostato 2 minuti, quando la differenza tra il minuto attuale e quello dell'ultima segnalazione di presenza è maggiore di 2, l'utente viene eliminato.
Questa soluzione ovviamente funziona anche quando l'utente esce senza il tipico Logout, perché non essendo più sul sito, non segnalerà più la propria presenza...e quindi verrà tolto dalla variabile application.
Nello zip troverete 4 pagine:
- test.asp: che contiene il codice iniziale da inserire nella pagina di entrata
- presenza.asp: è la pagina nella quale viene segnalata la propria presenza
- utenti-online.asp: è la pagina che genera la tabella con l'elenco degli utenti, che conta gli utenti, e che elimina gli eventuali utenti usciti.
- esci-test.asp: la pagina per l'uscita tipo Logout.
Se volete fare una prova, accedete a questa pagina utenti realmente online (magari accedete con due o tre browser contemporaneamente così simulate l'entrata di diversi utenti)
Se volete scaricarvi lo zip clicca qui >> Utenti realmente online by alessio_1976
Lo script funziona con IE dal 7 in su, Firefox, Google Chrome, Safari.(testati da me)
Spero che possa esservi utile, e se qualcuno ha da apportare migliorie e modifiche, ben venga!
Attenzione!
Aggiornamento in data: 14/01/2010
Aggiunta: molti utenti mi hanno chiesto come sfruttare lo script per visualizzare lo username degli utenti.
Aggiungo un secondo Zip, che contiene lo script modificato, in modo che venga usata la variabile session che contiene lo Username degli utenti che accedono al sito, al posto della variabile che contiene l'Id della sessione, del precedente script.
Nello Zip, ci sono un paio di file in più, che servono a simulare un Login:
- "login.asp": che ha il modulo per entrare
- "crea-session.asp": che crea la variabile session chiamata "username", che poi verrà utilizzata nello script, per tenere traccia della presenza dell'utente. Ovviamente il mio consiglio è sempre quello di usare l'id dell'utente, e poi con quello, ricavare eventualmente gli username da visualizzare sul sito.
Vi metto il link per fare prima delle prove: controllo username realmente online
Vi allego lo zip qui... milanositi:utenti-realmente-online
lunedì 28 settembre 2009
Iscriviti a:
Commenti sul post (Atom)
Ciao alessio...visti i limiti dell'application, questa è di sicuro l'unica soluzione applicabile e funzionante che io abbia trovato(a meno che non ci si accontenti di mostrare utenti online che con grande probailità hanno lasciato il nostro sito da circa 20 min o anche di più.
RispondiEliminaPosto semplicissima soluzione per chi è interessato :
Ho modificato le tre pagine - utenti_online.asp - presenza.asp e test.asp - inserendo nell'application la sessione di login...eliminato in test.asp response e div...e incluso test.asp nelle pagine dove desidero segnalare la presenza... poi estraggo semplicemente dall'aplication l'user, che se presente è chiaramnete online.
Complimenti alessio...ciao alla pross.
Ottimo!
RispondiEliminaAnche io lo uso in maniera un po' modificata, salvandomi l'id dell'utente e creando una sotto-application che mi rileva e mi controlla gli utenti, all'interno di una determinata del mio sito.
Questa è solo una base aperta ad un sacco di riconfigurazioni!
Buona idea di partenza. Ma quello che hai postato ha un bug al cambio d'ora. Se memorizza il minuto 59 quando scatta l'ora il minuto diventa 0. L'ho provato registrando le sessioni in un DB e crea una sessione ad ogni ricarico pagina per tutta la durata del cambio 00->01. Io utilizzerei la variabile Time()
RispondiEliminaDevo controllare perché avevo previsto quel caso. Aggiorno e ti faccio sapere. Grazie e comunque se vuoi mandare una modifica...è ben accetta!
RispondiEliminafantastico script!
RispondiEliminaio ho una area riservata sul mio sito e vorrei che invece degli id di sessione comparissero i nomi utente di chi è loggato, come posso fare?
grazie
Ciao Fede,
RispondiEliminagrazie per il commento positivo!
Allora: io, in questo esempio, ho sfruttato la l'id della sessione che viene creata sul server ad ogni accesso, che è un id univoco.... Diciamo che ricrea una situazione di un normale sito, dove ogni utente ha un proprio id univoco, per individuarlo all'interno del database, quindi la prima operazione, sarebbe quella di sostituire le variabili "session.sessionID" che trovi sia all'ingresso, dove lanci lo script, che nella pagina "presenza", che è dove viene segnalata in automatico la presenza dell'utente.
Quindi, lo script di ingresso, che è nella pagina "test", va messo nella tua pagina di accesso degli utenti, dopo che hanno fatto il login. Ti crei, oltre alla session "username", anche la session "id_utente"(che penso tu già abbia), e sostituisci con la session "id_utente" le session.sessionID. A quel punto, se vorrai avere i nomi degli utenti, non dovrai far altro che splittare l'array con tutti gli id degli utenti, che poi è la variabile application chiamata "user", ed estrarre il nome utente per ogni elemento dell'array(che è l'id_utente).
Potresti anche provare sostituendo direttamente la session.sessionID con la session("username")... funziona anche in quel caso...(anche se io preferisco usare gli id)...ma penso che gli username dei tuoi utenti, siano univoci...quindi non ci sarebbe problema.
Prova e facci sapere!
Ciao
Ciao Fede...ti ho preparato una versione che usa lo username degli utenti.
RispondiEliminaProva e vedi se riesci ad adattarla alle tue esigenze.
Ciao!
ciao Alessio, intanto complimenti per questa guida, davvero ben fatta. Volevo sapere se hai implementato qualcosa del genere in Asp .net, faccio un po di fatica a leggere e convertire Asp.
RispondiEliminagrazie mille saluti
Ciao Armando,
RispondiEliminagrazie dei complimenti...non fanno mai male...
Ma hai provato a far "convivere" i file ASP con i tuoi ASP.Net? Tanto sono file indipendenti, e le funzioni che li richiamano sono Javascript... Poi per richiamarle è solo questione di usare la "Session".
Ciao Alessio ottimo script...tuttavia non capisco perchè dopo qualche minuto che una persona è ferma sulla pagina, la pagina non segnala più la presenza della persona.
RispondiEliminaDove sbaglio ? :-(
Ciao Alessio sono di nuovo, mi sono reso conto di aver fatto davvero una domanda troppo generica prima. E' che ho modificato i tuoi script per fare in modo di avere: un pagina con il login che rimanda a una chat. Nella pagina del login sono anche visualizzati i nomi degli utenti che sono in chat (quindi di quelli che hanno già fatto il login).
RispondiEliminaNaturalmente per far ciò ho modificato un pò lo script.
Funziona tutto, ma dopo qualche minuto, se aggiorno la pagina del login, i nomi visualizzati scompaiono come se perdessero la presenza.
Potresti aiutarmi anche grossolanamente per dirmi in grandi linee il procedimento corretto?
Ciao Casatiello,
RispondiEliminain effetti è strano che tu non veda l'elenco degli utenti presenti, perché è contenuto nella variabile "application" che è comune a tutti.
Per il fatto che sei fermo nella pagina e non segnala la presenza, devi solo controllare che le funzioni Javascript che si trovano nel tag "body", partano a dovere come impostato da SetTimeout e SetInterval.
Ma per quel problema che riscontri nella pagina "login" dove hai l'elenco, e dove dopo un po' non vedo più l'elenco, nella pagina degli utenti che dovrebbero essere online, cosa vedi? Non vedi più l'elenco nella pagina di nessuno? (intendo quando fai le prove, che farai o con diversi browser o con diversi Pc, la situazione è uguale su tutti?)
Ciao Alessio grazie per la risposta...ti faccio ancora i complimenti perchè il tuo script è una piccola chicca e funziona bene. Se non funziona la colpa è mia...anche se non capisco perchè :-(
RispondiEliminaTi spiego ancora meglio che ho combinato:
Nella home page ho messo due numeri che vedono gli utenti di due pagine diverse: chat e videochat. Poi nella pagina chat ci sono i nick delle persone che sono in videochat e c'è il login per la videochat.
Ora il conteggio degli utenti in chat funziona bene, non la presenza non si perde fin quando l' utente non entra in videochat.
Il problema è la pagina della della videochat: dopo il tempo stabilito dal timeout la presenza si perde cioè il numero della home page si decrementa e i nomi in chat spariscono.
Non vorrei che non possono convivere due conteggi insieme. E' cosi?
Alessio ho capito cosa manda in crisi la presenza: nella pagina test.asp alla fine ho inserito un div id che fa partire la videochat, solo che se lo inserisco alla fine del body funziona la videochat, la presenza è segnalata...ma non viene aggiornata !
RispondiEliminaCome mai? Potresti risolvere questo problema per favore? penso che abbia a che fare con le richieste multiple ma non sono cosi esperto.
Ho detto una cosa sbagliata di nuovo :-(
RispondiEliminaIl div è presente anche altrove e funziona bene...forse perchè questo punto a una pagina esterna al sito ?
Ciao,
RispondiEliminama riesci a farmi vedere lo script in azione? Hai dei link? Oppure un pacchetto con i file da installare, così mi rendo conto..
Magari Alessio volentieri mi faresti un gran piacere...hai una email così ti mando tutto? non mi va di inserire qui i link.
RispondiEliminaLa mia mail è info @ milanositi.it
RispondiEliminaTi ringrazio, ti ho appena mandato link e sorgenti per email.
RispondiEliminaCiao Alessio non so se hai ricevuto i miei file per posta, non mi hai risposto più :-(
RispondiEliminaCmq ho anche io lo stesso problema evidenziato da Anonimo ciò che all' ora 00 si perde la presenza.
Hai per caso fatto già una modifica allo script in questo senso?
Questo commento è stato eliminato dall'autore.
RispondiEliminaaiuto aiuto, con safari non funziona nemmeno questo script, credo sia un problema di iis, ho il 7.5. non mi da il nome utente e come se non prendesse i session. che posso fare?
RispondiEliminahelp me, ho uno sito scritto in classic asp, funziona benissimo con tutti i browser, ma con safari non recepisce i session !!!
RispondiEliminaho provato a cambiare i form con get invece di post, ma per la password non va bene e poi dovrei riscrivere tutti moduli, non lo so credo sia un problema di response.redirect() ho provato anche con BASE HREF/ ma nulla.
ultima cosa credo che sia un problema di iis 7.5 e safari di mac. p.s. con safari di i-phone funziona !!!
Ciao Roberto,
RispondiEliminaho fatto delle prove su Safari, ma sembra funzionare con un IIS 6...purtroppo non ho occasione di provare col 7.5.
Penso che le session vengano supportate sempre nello stesso modo, anche perché sarebbe assurdo, contando il numero di siti che ancora vivono su quelle...fammi sapere se trovi una via di fuga, perché riesco difficilmente ad aiutarti!
grazie per la risposta alessio, ma tu credi sia un problema di configurazione del iis7.5? ho letto molti siti che usano base href al posto di response.redirect, ma non funziona uguale.
RispondiEliminacome posso fare?
Ma poi all'interno di questo script, a cosa ti serve il response.redirect? Lo script fa solo delle chiamate asincrone con Ajax, per segnalare una presenza..in pratica aggiorna solo una session ed una application...
RispondiEliminaNon dovrebbe essere una cosa legata allo script...
Questo commento è stato eliminato dall'autore.
RispondiEliminaQuesto commento è stato eliminato dall'autore.
RispondiEliminaQuesto commento è stato eliminato dall'autore.
RispondiEliminaQuesto commento è stato eliminato dall'autore.
RispondiEliminaQuesto commento è stato eliminato dall'autore.
RispondiEliminaQuesto commento è stato eliminato dall'autore.
RispondiEliminaQuesto commento è stato eliminato dall'autore.
RispondiEliminaQuesto commento è stato eliminato dall'autore.
RispondiEliminaQuesto commento è stato eliminato dall'autore.
RispondiElimina