我正在用 GWT 编写一个应用程序,我需要检测用户何时离开我的应用程序或何时关闭浏览器窗口(onUnload 事件)并执行注销(会话失效和其他一些清理任务)。注销操作由 servlet 执行。
我目前通过挂钩 onUnload() 事件并打开一个指向注销 servlet 的新窗口来执行此操作。
有一个更好的方法吗?欢迎任何其他建议。
我正在用 GWT 编写一个应用程序,我需要检测用户何时离开我的应用程序或何时关闭浏览器窗口(onUnload 事件)并执行注销(会话失效和其他一些清理任务)。注销操作由 servlet 执行。
我目前通过挂钩 onUnload() 事件并打开一个指向注销 servlet 的新窗口来执行此操作。
有一个更好的方法吗?欢迎任何其他建议。
为什么不制作一个非常短暂的会话 cookie,它会在每次页面加载时重置,然后添加一个跟踪 cookie。当用户返回时,您会注意到跟踪 cookie,但没有会话 cookie。使会话到期并在那时清除所有内容。
弹出窗口阻止程序会在阻止 onUnload 窗口打开时阻止您的会话清理,因为这是垃圾邮件发送者使用的东西。
这是关闭事件的工作方式:
Window.addWindowClosingHandler(new Window.ClosingHandler()
{
@Override
public void onWindowClosing(ClosingEvent event)
{
event.setMessage("Are you sure?");
}
});
然后 GWT 让用户有机会说是或否。当然,您也可以在其中添加一个测试,看看他们是否有任何未保存的数据或您想要的任何数据。不设置消息或将其设置为 null 不会执行任何操作。
做到这一点的方法是使用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;
}
}