关闭窗口时如何注销我的应用程序?

Fis*_*Man 5 javascript ajax jsp servlets

在我的聊天应用程序中,我有退出按钮,它工作正常.

现在我还需要在关闭浏览器窗口时注销应用程序.我怎么能实现这个...

提前致谢...

epa*_*llo 10

客户端没有确切的方法可以做到这一点.退出页面时不会触发任何事件.应该使用服务器上的Session End事件来完成.

您可以尝试使用onbeforeunload或unload,但竞争条件将阻止这种情况发生.并且它们不会因浏览器崩溃,丢失互联网连接等而触发.


Ale*_*ack 6

将您的注销代码添加到 on onunload事件。

window.onunload = function () {
    //logout code here...
}
Run Code Online (Sandbox Code Playgroud)

在 JQuery 中,您可以使用.unload()函数。请记住,您没有太多时间,因此您可以发送 Ajax 请求,但结果可能无法到达客户端。

另一个技巧是打开一个新的小窗口并在那里处理注销。

window.open("logout url","log out","height=10,width=10,location=no,menubar=no,status=no,titlebar=no,toolbar=no",true);
Run Code Online (Sandbox Code Playgroud)

如果要禁用关闭窗口(或至少警告用户),可以使用以下代码:

window.onbeforeunload = function(event) {
    //if you return anything but null, it will warn the user.
    //optionally you can return a string which most browsers show to the user as the warning message.
    return true;
}
Run Code Online (Sandbox Code Playgroud)

另一个技巧是每隔几秒钟就不断地 ping 客户端。如果没有回复,则假设用户已关闭窗口、浏览器崩溃或存在网络问题导致聊天会话结束。在客户端,如果您没有收到这个 ping 包,您可以假设网络连接或服务器有问题,您可以显示注销警告(并可选择让用户再次登录)。

  • 注意:在页面重新加载(F5)时执行相同的操作,您肯定不想注销。对于那些不想打开弹出窗口也不想使用 XHR 请求的人,还有其他可能性:将 <image/>、<script/> 或 <iframe/> 标记指向注销 URL。 (2认同)

jbo*_*ino 6

我最近在angularJS应用程序中处理了这个问题 - 主要问题是如果你刷新我不想让你退出,但我确实想要关闭标签..使用onbeforeunload/onunload的Ajax请求不是保证等待响应,所以这是我的解决方案:

我在登录时设置了一个sessionStorage cookie,这只是一个bool - 当我得到登录响应时设置为true

sessionStorage.setItem('activeSession', 'true');

显然,在注销时,我们将此标志设置为false

无论是当控制器初始化或使用的window.onload(在我的app.js文件) -我检查这个activeSession布尔..如果是假的,我有这个小if语句-其中,如果条件得到满足我打电话给我的注销方法ONLOAD代替onunload

   var activeSession = sessionStorage.activeSession;
    if (sessionStorage.loggedOutOnAuth) {
        console.log('Logged out due to expiry already')
    }
    else if (!activeSession) {
        sessionStorage.loggedOutOnAuth = true;
        _logout()
    }
Run Code Online (Sandbox Code Playgroud)

基本上,"loggedOutAuth"bool让我知道我刚刚在页面加载时使你过期,因为sessionStorage中没有activeSession所以你不会陷入循环

这对我来说是一个很好的解决方案,因为我不想实现心跳/ websocket