Fis*_*Man 5 javascript ajax jsp servlets
在我的聊天应用程序中,我有退出按钮,它工作正常.
现在我还需要在关闭浏览器窗口时注销应用程序.我怎么能实现这个...
提前致谢...
epa*_*llo 10
客户端没有确切的方法可以做到这一点.退出页面时不会触发任何事件.应该使用服务器上的Session End事件来完成.
您可以尝试使用onbeforeunload或unload,但竞争条件将阻止这种情况发生.并且它们不会因浏览器崩溃,丢失互联网连接等而触发.
将您的注销代码添加到 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 包,您可以假设网络连接或服务器有问题,您可以显示注销警告(并可选择让用户再次登录)。
我最近在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