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

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

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

有帮助吗?

解决方案

看来 GWT 确实有一个专门针对此问题的活动。

闭幕式.

看起来你需要实施一个 关闭处理程序

其他提示

为什么不只是做一个非常短暂的会话cookie是在每个页面载入复位,然后添加一个跟踪Cookie。当用户返回您注意到跟踪cookie,但没有会话cookie。过期的会议,并在这一点上清除一切。

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

这是结束活动是如何工作的:

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

然后GWT为用户提供了一个机会说yes或no。当然,你也可以在里面添加一个测试,看看他们有任何未保存的数据或任何你想要的。不设置消息或将其设置为空不会做任何事情。

做到这一点的办法是使用Window.addWindowClosingHandler等@Carnell和@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;
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top