La mejor manera de detectar el navegador de cierre / navegación a otra página y hacer cierre de sesión

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

Pregunta

Estoy escribiendo una aplicación en GWT y necesito para detectar cuando un usuario salga de mi solicitud o cuando se cierra la ventana del navegador (evento onUnload) y hacer un cierre de sesión (sesión de invalidación y algunas otras tareas de limpieza). La acción de cierre de sesión se realiza mediante un servlet.

Actualmente estoy haciendo esto enganchando en el caso onUnload () y abriendo una nueva ventana señaló al servlet de cierre de sesión.

¿Hay una mejor manera de hacer esto? ¿Alguna otra sugerencia son bienvenidos.

¿Fue útil?

Solución

Parece que GWT tiene un evento para exactamente esto.

ClosingEvent .

Parece que es necesario implementar un ClosingHandler

Otros consejos

¿Por qué no hacer una cookie de sesión muy corta duración que se restablece con cada carga de la página, a continuación, añadir una cookie de seguimiento. Cuando el usuario vuelve observa la cookie de seguimiento, pero no hay ninguna cookie de sesión. Caducará la sesión y aclarar todo en ese punto.

pop-bloqueadores para evitar que su sesión de limpiar cuando bloquea la ventana abierta onUnload, porque esto es algo que utilizan los spammers.

Esto es cómo funciona el evento de cierre:

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

A continuación, GWT le da al usuario la oportunidad de decir sí o no. Por supuesto, también puede agregar una prueba en la que hay para ver si tienen los datos no guardados o lo que quieras. No se establece el mensaje o poniéndolo a cero no hace nada.

La forma de hacerlo es utilizar el Window.addWindowClosingHandler como @Carnell y @BillLyons dijo. Pero yo uso una técnica adicional para detectar si el navegador se ha cerrado o si la página está siendo visitada de nuevo (por actualización o la navegación de regreso).

A continuación hay una clase de utilidad que le puede ayudar. Sólo tiene que llamar las líneas de abajo en su onModuleLoad a prueba.

El ejemplo uso :

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

La clase de utilidad :

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;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top