Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    AJAX onunload e chiamate sincrone

    Dunque, per sicurezza, nel sito a cui sto lavorando devo eseguire del codice (delle query, più che altro) quando l'utente esce dal sito.

    L'unico modo per farlo è usare l'evento onunload di JS e AJAX.

    Il problema è che, ovviamente, in caso di chiamata asincrona il browser chiude la pagina ancor prima di aver ricevuto la risposta dal server (proprio perchè è asincrona la chiamata).

    Quindi l'unico modo per risolvere è effettuare una chiamata sincrona con AJAX .

    Qualcuno ha qualche esempio di chiamate in AJAX sincrone? SJAX?

  2. #2
    tu usi qualche libreria di Ajax (Prototypes, Mootools) perché dovrebbero avere tutte l'opzione da passare quando fai la richiesta.

    ad esempio, in mootools hai tra la options async : false e la chiamata diventa sincrona.

    Ma se, l'utente sta uscendo che ti serve aspettare la risposta dal server? segnala con una chiamata asincrona che l'utente esce ed esegui il logout forzato sul server, dovrebbe funzionare anche se non ricevi risposta.

  3. #3
    Originariamente inviato da artorius
    tu usi qualche libreria di Ajax (Prototypes, Mootools) perché dovrebbero avere tutte l'opzione da passare quando fai la richiesta.

    ad esempio, in mootools hai tra la options async : false e la chiamata diventa sincrona.

    Ma se, l'utente sta uscendo che ti serve aspettare la risposta dal server? segnala con una chiamata asincrona che l'utente esce ed esegui il logout forzato sul server, dovrebbe funzionare anche se non ricevi risposta.
    uso AHAH che non ha un impostazione del genere.
    Serve perchè se non ricevo risposta non posso sapere se l'utente ha completato la query prima che il browser ha chiuso la finestra... no?
    In locale funziona, ma già per esempio se provo sul server vero e proprio 1 volta su 3 il browser si chiude prima ancora di caricare la pagina con la query.

    L'unico modo che mi viene in mente adesso è mettere un alert dopo la funzione ajax, ma è inusabile.

  4. #4
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    Originariamente inviato da The Captain
    ... se non ricevo risposta non posso sapere se l'utente ha completato la query ...
    Ma... non posso sapere chi? L'utente o tu gestore del server?

    ciao

    ps: e' una domanda retorica in entrambi i casi mi pare del tutto inutile, l'importante e' che il server riceva la segnalazione, cosa fa il server non dipende da cio' che fa il browser dopo la richiesta.
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  5. #5
    Originariamente inviato da br1
    Ma... non posso sapere chi? L'utente o tu gestore del server?
    Non ho ben capito la domanda, sinceramente

    Dunque, la situazione è questa:
    Tizio entra nella pagina -> evento onload -> query via ajax (più o meno UPDATE tabella_utenti SET online = 1 WHERE id_tizio = $_SESSION['id'].. ma non importa tanto la query, deve solo "dire" allo script che l'utente è online in quel momento)

    Tizio esce dalla pagina -> evento onunload -> query (stessa cosa di prima ma setta online su 0)

    Questo mi serve per controllare che l'utente non faccia il furbo cercando di connettersi due volte con due browser diversi. Al login controllo semplicemente se Online è settato su 0, altrimenti do un link all'utente per disconnettere l'altro utente già connesso.

    Adesso, la chiamata asincrona è, di per se, indipendente dal browser.
    La pagina che deve caricare esegue solo quella query stupida, quindi dovrebbe essere possibile eseguire la query prima che il browser chiuda la connessione al sito.. ma come faccio ad essere sicuro che la query sia stata eseguita, che non ci sia stato un'errore o quant'altro, se non ricevo prima una risposta dal server?
    Il problema è esattamente questo.. il browser si chiude prima di aver ricevuto una risposta completa dal server.
    Ecco, è questo il problema.. l'unico modo per esserne sicuro è eseguire una chiamata sincrona, giusto?

  6. #6
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    1- Il browser manda una richiesta al server;
    2- Il server elabora la richiesta e prepara una pagina, le assegna come destinazione il browser che l'ha chiesta e la affida alla rete perche' la recapiti.

    Questo e' il normale funzionamento del web: il server non controlla l'esito del suo invio, quindi accertarsi sul browser che la query sia stata completata non ha senso...

    Inoltre se anche il browser non riceve la risposta potrebbe essere un problema della rete, anche se e' piu' probabile che la query sia stata scritta male...

    Ma hai verificato se qualche volta l'utente rimane collegato anche se il browser e' chiuso?

    ciao
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  7. #7
    Mi sa che non ci siamo ancora capiti o forse sono io che non mi so spiegare bene (probabile).
    Detto terra-terra:
    Quando effettui una chiamata asincrona o sincrona che sia, ci sono 4 "stati" (che sarebbero readystate):
    0 La richiesta non è inizializzata
    1 La richiesta è stata inizializzata
    2 La richiesta è stata inviata
    2 La richiesta è in elaborazione
    4 La richiesta è completa, significa quindi che possiamo leggere i dati restituiti dal server.
    (da wikipedia)

    Adesso, devo semplicemente fare in modo che il browser si chiuda solo quando lo stato viene cambiato (onreadystatechange) così che possa mostrare, per esempio, un alert nel caso ci sia stato un'errore.

    Se uso una semplice chiamata asincrona, non è possibile "far aspettare" il browser fino a quando lo stato non è cambiato (o almeno, dalle mie prove è così), se non utilizzando alcuni stratagemmi (un'alert che blocca il browser mentre in background si effettua la chiamata).

    Spero di essermi fatto capire, altrimenti lascio perdere e faccio un semplice controllo a tempo, che mi sembra anche più semplice.


  8. #8
    Ciao,

    potresti impostare una funzione da richiamare in corrispondenza dell'evento "onreadystatechange":

    http.onreadystatechange = function () {
    if (http.readyState == 4) {
    if (http.status == 200)
    alert("Operazione effettuata con successo");
    else
    alert("Operazione fallita, errore numero " + http.status);
    }
    }
    "Se in un primo momento l'idea non è assurda, allora non c'è nessuna speranza che si realizzi."

  9. #9
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    mi dispiace darti questa notizia, ma il fatto di indicare cghe un utente NON e' piu on line tramite una richiesta ajax sull' evento onunload NON E' AFFIDABILE...

    la questione e' molto semplice: supponiamo che io entri sul sito e mi loggo.

    durante la navigazione apro un link in un' altra scheda e ho 2 schede sul sito in cui sono loggato.

    chiudo la prima scheda da dove sono entrato e mi rimane la seconda scheda aperta....

    cosa succede se continuo la navigazione dalla seconda scheda? che ovviamente mi impedisce di continuare perche' tu cosi' mi leghi a qualsiasi pagina aperta.. non e' per niente corretto ti pare?

    inoltre ti si potrebbero generare diversi errori se non effettui controlli in questo modo

    ti ricordo che nel caso in cui effettui un login ad un sito ed apri 1000 schede in quel sito, la sessione e' sempre aperta... per ogni scheda!
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  10. #10
    fattibilissimo, chiamata sincrona, eventuale richiesta di conferma nell'evento onbeforeunload, e pace.

    La chiamata sincrona non ti serve per elaborare la risposta del server e verificare nel browser che la query sia stata effettuata, come ti è già stato detto, la risposta del server serve solo per sbloccare il browser dell'utente in chiusura, quindi puoi anche stampare ciao, e fine, perchè nel server hai tutto quello che ti serve.

    Il discorso multi tab regge e non regge, perchè se sei tu a volere controllare l'utente, non devi permettere multitab, e di metodi ce sono diversi, ma sono un tantino avanzati, e per uno che usa AHAH, difficili da spiegare in pochi passaggi.

    In soldoni, dipende tutto da quanto controllo e quanta libertà vuoi lasciare all'utente.

    C'è chi fa semplicemente polling, o ping client server, e c'è chi usa Comet. Domani useremo, se Zio vuole, le socket, e tutti sti problemi saranno risolti (almeno per quelli che sanno gestire le sockets).

    Il polling, è un ping ogni N secondi, capace di aggiornare la situazione utente.

    Se ogni N secondi arriva il ping, l'utente è li, altrimenti l'utente non c'è più, gli è caduta la linea, gli è esploso il portatile, altro, tutte cose che a te non interessano.

    Il "ping" lo fai in setTimeout e, se proprio devi, con AHAH o qualunque altra libreria. La risposta, come l'invio di info, deve essere ridotta ai minimi termini, il rischio è avere un server che barcolla
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.