2009-05-20 17 views
8

Estoy escribiendo una aplicación en GWT y necesito detectar cuando un usuario navega fuera de mi aplicación o cuando cierra la ventana del navegador (evento OnUnload) y lo hace un cierre de sesión (invalidación de sesión y algunas otras tareas de limpieza). La acción de cierre de sesión la realiza un servlet.La mejor manera de detectar el cierre/navegación del navegador a otra página y cerrar sesión

Actualmente estoy haciendo esto enganchándome en el evento onUnload() y abriendo una nueva ventana apuntando al servlet de cierre de sesión.

¿Hay una mejor manera de hacerlo? Cualquier otra sugerencia es bienvenida.

+0

duplicado de esta pregunta. http://stackoverflow.com/questions/875380/how-to-tell-the-difference-between-a-page-refresh-and-closing-a-page –

+1

Esa pregunta no es un duplicado de esta. –

+0

La respuesta responde esta pregunta: no se puede saber cuándo el usuario ha dejado de usar su sitio. Lo más cerca que puede hacer es decir cuándo el usuario no ha enviado una nueva solicitud al sitio durante un período de tiempo determinado. – Quentin

Respuesta

5

Parece que GWT tiene un evento para exactamente esto.

ClosingEvent.

Parece que es necesario implementar un ClosingHandler

+0

Debería poder enviar una última solicitud de cierre de sesión a su servidor en su controlador. – Carnell

+0

Acabo de ejecutar una prueba rápida para crear un ClosingHandler y lo registré. Hice uno simple que solo muestra una alerta. El código se activa cuando la pestaña/ventana se cierra y cuando navego a otra página fuera de la aplicación. – Carnell

+1

Conozco este WindowCloseListener (equivalente a ClosingEvent en GWT 1.5), pero asumí que, dado que un objeto RequestCallback es obligatorio para realizar una solicitud, puede causar algún problema en los eventos de devolución de llamada.Pero probé con un RequestCallback sin hacer nada en el evento onResponseReceived, y está funcionando bien. Gracias por la respuesta. –

2

¿Por qué no acaba de crear una cookie de sesión de vida muy corta que se restablece con cada carga de página, luego agregue una cookie de seguimiento. Cuando el usuario regresa, observa la cookie de seguimiento, pero no la cookie de sesión. Caduque la sesión y limpie todo en ese punto.

Los bloqueadores de ventanas emergentes evitarán que la sesión se limpie cuando bloquee la ventana de onUnload abierta, porque esto es algo que los spammers usan.

1

Así es como funciona el evento de cierre:

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

Entonces GWT le da al usuario la oportunidad de decir sí o no. Por supuesto, también puede agregar una prueba para ver si tienen datos no guardados o lo que sea que desee. No establecer el mensaje o establecerlo como nulo no hace nada.

0

La forma de hacerlo es usar Window.addWindowClosingHandler, como lo indica @Carnell y @BillLyons. Pero utilizo una técnica adicional para detectar si el navegador se ha cerrado o si la página se vuelve a visitar (mediante actualización o navegación hacia atrás).

A continuación hay una clase de utilidad que puede ayudarlo. Simplemente llame a las líneas a continuación en su onModuleLoad para probar.

El ejemplo el 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; 
    } 
} 
Cuestiones relacionadas