2009-05-20 5 views
8

Ich schreibe eine Anwendung in GWT und ich muss erkennen, wenn ein Benutzer weg von meiner Anwendung navigiert oder wenn er das Browserfenster schließt (OnUnload-Ereignis) und tun eine Abmeldung (Sitzungsinvalidierung und einige andere Bereinigungsaufgaben). Die Abmeldeaktion wird von einem Servlet ausgeführt.Der beste Weg, Browser schließen/Navigation zu anderen Seite zu erkennen und abmelden

Ich mache dies derzeit, indem Sie in das onUnload() - Ereignis einhaken und ein neues Fenster öffnen, das auf das Logout-Servlet zeigt.

Gibt es einen besseren Weg, dies zu tun? Alle anderen Vorschläge sind willkommen.

+0

Duplikat dieser Frage. http://stackoverflow.com/questions/875380/how-to-tell-the-difference-between-a-page-refresh-and-closing-a-page –

+1

Diese Frage ist kein Duplikat von diesem. –

+0

Die Antwort beantwortet diese Frage zwar - Sie können jedoch nicht feststellen, wann der Benutzer Ihre Website nicht mehr verwendet. Die nächste Möglichkeit besteht darin, festzustellen, wann der Benutzer für einen bestimmten Zeitraum keine neue Anfrage an die Site gesendet hat. – Quentin

Antwort

5

Sieht aus wie GWT hat ein Ereignis für genau dies.

ClosingEvent.

Sieht aus wie Sie Dies ist ein ClosingHandler

+0

Sie sollten eine letzte Abmeldeanforderung an Ihren Server in Ihrem Handler senden können. – Carnell

+0

Ich habe gerade einen Schnelltest durchgeführt, um einen ClosingHandler zu erstellen und registriert. Ich habe ein einfaches gemacht, das nur eine Warnung anzeigt. Der Code wird ausgelöst, wenn die Registerkarte/das Fenster geschlossen wird oder wenn ich zu einer anderen Seite außerhalb der App navigiere. – Carnell

+1

Ich kenne diesen WindowCloseListener (gleichbedeutend mit ClosingEvent in GWT 1.5), ging aber davon aus, dass, da ein RequestCallback-Objekt zwingend erforderlich ist, um eine Anfrage zu stellen, ein Problem bei den Rückrufereignissen auftreten kann.Aber ich habe versucht, mit einem RequestCallback nichts auf dem onResponseReceived-Ereignis zu tun, und es funktioniert gut. Danke für die Antwort. –

2

Warum nicht einfach ein sehr kurzlebiges Session-Cookie erstellen, das bei jedem Laden der Seite zurückgesetzt wird, und dann ein Tracking-Cookie hinzufügen. Wenn der Benutzer zurückkehrt, bemerken Sie den Tracking-Cookie, aber keinen Session-Cookie. Beenden Sie die Sitzung und löschen Sie alles zu diesem Zeitpunkt.

Popup-Blocker verhindern, dass Ihre Sitzung bereinigt wird, wenn sie das geöffnete onUnload-Fenster blockiert, da dies von Spammern verwendet wird.

1

implementieren müssen, wie die Abschlussveranstaltung funktioniert:

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

Dann GWT gibt dem Benutzer die Möglichkeit, ja oder nein zu sagen. Natürlich können Sie auch einen Test hinzufügen, um zu sehen, ob sie nicht gespeicherte Daten haben oder was immer Sie wollen. Wenn Sie die Nachricht nicht setzen oder auf null setzen, wird nichts unternommen.

0

Der Weg, um dies zu tun, ist die Verwendung der Window.addWindowClosingHandler wie @Carnell und @BillLyons sagte. Aber ich verwende eine zusätzliche Technik, um zu erkennen, ob der Browser geschlossen wurde oder ob die Seite erneut besucht wird (durch Auffrischen oder Zurück-Navigation).

Im Anschluss gibt es eine Dienstprogrammklasse, die Ihnen helfen kann. Rufen Sie einfach die folgenden Zeilen in Ihrem onModuleLoad zum Testen an.

Die Verwendung Beispiel:

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

Die Utility-Klasse:

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; 
    } 
} 
Verwandte Themen