Il modo migliore per rilevare la chiusura del browser / navigazione ad altre pagine e fare il logout

StackOverflow https://stackoverflow.com/questions/888483

Domanda

Sto scrivendo un'applicazione in GWT e ho bisogno di rilevare quando un utente si sposta lontano da mia domanda o quando si chiude la finestra del browser (evento onUnload) e fare un logout (sessione di invalidazione e poche altre operazioni di pulizia). L'azione di logout viene eseguita da un servlet.

Al momento sto facendo questo agganciando nell'evento onUnload () e l'apertura di una nuova finestra indicò la servlet logout.

C'è un modo migliore per fare questo? Eventuali altri suggerimenti sono i benvenuti.

È stato utile?

Soluzione

Sembra che GWT ha un evento proprio per questo.

ClosingEvent .

Sembra è necessario implementare un ClosingHandler

Altri suggerimenti

Perché non basta fare un cookie di sessione molto di breve durata che viene resettato ad ogni caricamento della pagina, quindi aggiungere un cookie per il monitoraggio. Quando l'utente ritorna si nota il cookie di tracciamento, ma nessun cookie di sessione. Scade la sessione e cancellare tutto fino a quel punto.

pop up bloccanti impedisce la sessione di ripulire quando blocca la finestra onUnload aperta, perché questo è qualcosa che gli spammer utilizzano.

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 offre all'utente la possibilità di dire sì o no. Naturalmente è anche possibile aggiungere un test in là per vedere se hanno i dati non salvati o quello che volete. Non l'impostazione del messaggio o impostandolo su null non fa nulla.

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

A seguito c'è una classe di utilità che può aiutare. Basta chiamare le linee qui sotto nella tua onModuleLoad di prova.

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;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top