检测浏览器关闭/导航到其他页面并执行注销的最佳方法

时间:2009-05-20 15:02:49

标签: javascript gwt logout onunload

我正在GWT中编写一个应用程序,我需要检测用户何时离开我的应用程序或何时关闭浏览器窗口(onUnload事件)并执行注销(会话失效和其他一些清理任务)。注销操作由servlet执行。

我目前正在执行此操作,方法是挂钩onUnload()事件并打开一个指向注销servlet的新窗口。

有更好的方法吗?欢迎任何其他建议。

4 个答案:

答案 0 :(得分:5)

看起来GWT确实有这样的事件。

ClosingEvent

您似乎需要实施ClosingHandler

答案 1 :(得分:2)

为什么不在每个页面加载时重置一个非常短暂的会话cookie,然后添加一个跟踪cookie。当用户返回时,您会注意到跟踪cookie但没有会话cookie。暂停会话并在那时清除所有内容。

弹出窗口阻止程序会阻止会话在打开onUnload窗口时清理,因为这是垃圾邮件发送者使用的。

答案 2 :(得分:1)

这是结束事件的工作方式:

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

然后GWT让用户有机会说是或否。当然,你也可以在那里添加一个测试,看看他们是否有任何未保存的数据或任何你想要的。不设置消息或将其设置为null不会执行任何操作。

答案 3 :(得分:0)

这样做的方法是使用像@Carnell这样的Window.addWindowClosingHandler和@BillLyons说。但我使用另一种技术来检测浏览器是否已关闭或者是否再次访问该页面(通过刷新或返回导航)。

以下是一个可以帮助您的实用程序类。只需拨打onModuleLoad中的以下行进行测试即可。

使用示例

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

实用程序类

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