Le meilleur moyen pour détecter la fermeture du navigateur / navigation à d'autres pages et faire fermeture de session

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

Question

Je suis en train d'écrire une application GWT et je dois détecter lorsqu'un utilisateur quitte ma demande ou quand il ferme la fenêtre du navigateur (événement onUnload) et faire un logout (infirmation de session et quelques autres tâches de nettoyage). L'action de fermeture de session est effectuée par un servlet.

Je suis en train de faire ce en accrochant dans l'événement onUnload () et l'ouverture d'une nouvelle fenêtre a la servlet logout.

Y at-il une meilleure façon de le faire? Toutes les autres suggestions sont les bienvenus.

Était-ce utile?

La solution

On dirait que GWT n'avoir un événement exactement cela.

ClosingEvent .

On dirait que vous avez besoin de mettre en œuvre un ClosingHandler

Autres conseils

Pourquoi ne pas simplement faire un cookie de session très courte durée qui est remis à zéro à chaque chargement de la page, puis ajoutez un cookie de suivi. Lorsque l'utilisateur vous retourne remarquez le cookie de suivi, mais aucun cookie de session. Expireront la session et tout effacer jusqu'à à ce moment-là.

Pop up blockers empêcheront votre session nettoyer quand il bloque la fenêtre onUnload ouverte, parce que c'est d'utiliser quelque chose spammeurs.

Voici comment l'événement de clôture fonctionne:

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

Ensuite GWT donne à l'utilisateur la possibilité de dire oui ou non. Bien sûr, vous pouvez également ajouter un test pour voir s'ils ont des données non enregistrées ou tout ce que vous voulez. Ne pas fixer le message ou le mettre à null ne fait rien.

La façon de le faire est d'utiliser le Window.addWindowClosingHandler comme @Carnell et @BillLyons dit. Mais j'utilise une technique supplémentaire pour détecter si le navigateur a été fermé ou si la page est visitée à nouveau (par rafraîchissement ou navigation arrière).

Après il y a une classe utilitaire qui peut vous aider. Il suffit d'appeler les lignes ci-dessous dans votre onModuleLoad à tester.

L'exemple d'utilisation :

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

La classe utilitaire :

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;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top