2009-05-20 13 views
8

Sto scrivendo un'applicazione in GWT e devo rilevare quando un utente si allontana dalla mia applicazione o quando chiude la finestra del browser (evento onUnload) e fa un logout (invalidazione della sessione e poche altre attività di pulizia). L'azione di logout è eseguita da un servlet.Il modo migliore per rilevare la chiusura/navigazione del browser verso un'altra pagina e fare il logout

Attualmente lo faccio agganciando l'evento onUnload() e aprendo una nuova finestra puntata sul servlet di logout.

C'è un modo migliore per farlo? Qualsiasi altro suggerimento è benvenuto.

+0

duplicato di questo argomento. http://stackoverflow.com/questions/875380/how-to-tell-the-difference-obetween-a-page-refresh-and-closing-a-page –

+1

Questa domanda non è un duplicato di questo. –

+0

La risposta risponde a questa domanda - non è possibile sapere quando l'utente ha smesso di usare il tuo sito. Il più vicino che puoi fare è dire quando l'utente non ha inviato una nuova richiesta al sito per un dato periodo di tempo. – Quentin

risposta

5

Sembra che GWT abbia un evento esattamente per questo.

ClosingEvent.

Sembra che è necessario implementare un ClosingHandler

+0

Dovresti essere in grado di inviare un'ultima richiesta di logout al tuo server nel gestore. – Carnell

+0

Ho appena eseguito un test rapido per creare un ClosingHandler e l'ho registrato. Ne ho fatto uno semplice che mostra solo un avviso. Il codice viene generato quando si chiude la scheda/finestra e quando si accede a un'altra pagina esterna all'app. – Carnell

+1

Sono a conoscenza di questo WindowCloseListener (equivalente di ClosingEvent in GWT 1.5), ma supponevo che, poiché un oggetto RequestCallback è obbligatorio per effettuare una richiesta, potrebbe causare alcuni problemi negli eventi di callback.Ma ho provato con un RequestCallback non fare nulla sull'evento onResponseReceived, e sta funzionando bene. Grazie per la risposta. –

2

Perché non basta creare un cookie di sessione di durata molto breve che viene reimpostato con ogni caricamento della pagina, quindi aggiungere un cookie di tracciamento. Quando l'utente ritorna, noti il ​​cookie di tracciamento ma nessun cookie di sessione. Scade la sessione e cancella tutto a quel punto.

I blocchi di pop-up impediscono la pulizia della sessione quando blocca la finestra onUnload aperta, perché si tratta di qualcosa che gli spammer utilizzano.

1

Questo è come funziona l'evento di chiusura:

Window.addWindowClosingHandler(new Window.ClosingHandler() 
{ 
@Override 
public void onWindowClosing(ClosingEvent event) 
{ 
    event.setMessage("Are you sure?"); 
} 
}); 

Poi GWT dà all'utente la possibilità di dire sì o no. Ovviamente puoi anche aggiungere un test lì per vedere se hanno dei dati non salvati o quello che vuoi. Non impostare il messaggio o impostarlo su null non fa nulla.

0

Il modo per farlo è utilizzare Window.addWindowClosingHandler come @Carnell e @BillLyons. Ma io uso una tecnica aggiuntiva per rilevare se il browser è stato chiuso o se la pagina viene nuovamente visitata (tramite aggiornamento o navigazione indietro).

Di seguito è disponibile una classe di utilità che può essere di aiuto. Basta chiamare le linee sottostanti nel tuo onModuleLoad per testare.

L'esempio uso:

@Override 
public void onModuleLoad() { 
    if (BrowserCloseDetector.get().wasClosed()) { 
     GWT.log("Browser was closed."); 
    } 
    else { 
     GWT.log("Refreshing or returning from another page."); 
    } 
} 

La classe di utilità:

import com.google.gwt.user.client.Cookies; 
import com.google.gwt.user.client.Window; 

public class BrowserCloseDetector { 
    private static final String COOKIE = "detector"; 
    private static BrowserCloseDetector instance; 

    private BrowserCloseDetector() { 
     Window.addWindowClosingHandler(new Window.ClosingHandler() { 
      public void onWindowClosing(Window.ClosingEvent closingEvent) { 
       Cookies.setCookie(COOKIE, ""); 
      } 
     }); 
    } 

    public static BrowserCloseDetector get() { 
     return (instance == null) ? instance = new BrowserCloseDetector() : instance; 
    } 

    public boolean wasClosed() { 
     return Cookies.getCookie(COOKIE) == null; 
    } 
}