Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检测浏览器关闭/导航到其他页面并注销的最佳方法_Javascript_Gwt_Logout_Onunload - Fatal编程技术网

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

Javascript 检测浏览器关闭/导航到其他页面并注销的最佳方法,javascript,gwt,logout,onunload,Javascript,Gwt,Logout,Onunload,我正在用GWT编写一个应用程序,我需要检测用户何时离开我的应用程序或何时关闭浏览器窗口(onUnload事件)并注销(会话失效和其他一些清理任务)。注销操作由servlet执行 我目前正在通过挂接onUnload()事件并打开一个指向注销servlet的新窗口来实现这一点 有更好的方法吗?欢迎您提出任何其他建议。为什么不制作一个非常短暂的会话cookie,在每次页面加载时重置,然后添加一个跟踪cookie呢。当用户返回时,您会注意到跟踪cookie,但没有会话cookie。终止会话并在此时清除所

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

我目前正在通过挂接onUnload()事件并打开一个指向注销servlet的新窗口来实现这一点


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

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


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

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


看起来您需要实现一个

这是关闭事件的工作方式:

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

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

方法是使用
窗口。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;
    }
}
实用程序类

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

这个问题的副本。这个问题不是这个问题的重复。但是答案确实回答了这个问题-你不知道用户何时停止使用你的网站。你能做的最接近的事情就是告诉用户在给定的时间段内什么时候没有向站点发送新请求。你应该能够在处理程序中向服务器发送最后一个注销请求。我刚刚运行了一个快速测试来创建ClosingHandler并注册它。我做了一个简单的,只是显示一个警报。当选项卡/窗口关闭时,以及当我浏览到应用程序之外的另一个页面时,代码被触发。我知道这个WindowCloseListener(相当于GWT 1.5中的ClosingEvent),但假设由于发出请求必须使用RequestCallback对象,它可能会导致回调事件出现一些问题。但是我尝试了一个RequestCallback对onResponseReceived事件不做任何操作,它工作得很好。感谢您的回复。这样的答案正是为什么不允许只链接到信息的原因。这两个都坏了。