首先,我对浏览器的onbeforeunload事件进行的拦截,每当遇到刷新和关闭等离开本页面的事件,就会询问是否要离开本页面。如果确认则自动退出,确保cookies与服务器登录状态的一致性。原来我依靠的方法是只要有cookies就会自动登录,但这解决不了cookies失效的第二个问题:
cookies是有自己的生存时间的,它会自我消失。
配合对onbeforeunload事件的拦截,我把cookies失效时间设为-1,则只有在浏览器或页面关闭时才会失效。避免了一般的误关闭标签页的问题。至于为什么拦截刷新等动作,是因为DWR库德原因,每刷新一次重新生成一个ScriptSession,这样会耗尽服务器资源。但是这样还存在隐患。就是:
这点不知道Webqq怎么做的,所以只好用一个笨办法就是允许多点登陆,即允许同一账号多人同时登录。这样就不会因为浏览器被强行关闭而失去cookies并且没及时退出登录,导致永远无法再次登录了。
当然这样还不够完美:退出时,只要有一人退出,其他此账号的人也会退出。这点有待改正,Webqq不会有这问题,因为他是强行登陆会挤下其他登录者。
我的onbeforeunload事件拦截代码是:
只支持firefox和IE。不支持chrome。没试过其他浏览器。
PS:firefox的cookies在被任务管理器强行关闭后,仍旧会保存,但IE不行。
关闭浏览器会有提醒,但是如果是任务管理器强行关闭或者操作系统直接关闭,也会导致cookies失效。
这点不知道Webqq怎么做的,所以只好用一个笨办法就是允许多点登陆,即允许同一账号多人同时登录。这样就不会因为浏览器被强行关闭而失去cookies并且没及时退出登录,导致永远无法再次登录了。
当然这样还不够完美:退出时,只要有一人退出,其他此账号的人也会退出。这点有待改正,Webqq不会有这问题,因为他是强行登陆会挤下其他登录者。
我的onbeforeunload事件拦截代码是:
function onbeforeunload_handler(){
return "您真的要离开本页吗?离开本页会自动退出登录!";
}
function onunload_handler(){
signOut();
}
function ShowConfirmClose(bValue) {
// alert("ShowConfirmClose('"+bValue+"')");
if(bValue) {
window.onbeforeunload = onbeforeunload_handler;
window.onunload = onunload_handler;
} else {
window.onbeforeunload = null;
window.onunload = null;
}
}
只支持firefox和IE。不支持chrome。没试过其他浏览器。
PS:firefox的cookies在被任务管理器强行关闭后,仍旧会保存,但IE不行。
没有评论:
发表评论