在线人数统计
实现方案。
用户登录时,记录用户信息,存入数据库表(online表)中。
用户登出包括用户点击退出按钮,用户关闭浏览器。
使用onbeforeunload和onunload方法。基本代码如下:
window.onbeforeunload = onbeforeunload_handler;
window.onunload = onunload_handler;
function onbeforeunload_handler(){
var warning="确认退出?";
return warning;
}
function onunload_handler(){
$.ajax({
type: "POST",
url: "${ctx}/monitor/closeBrowser.do",
async:false,
success: function(){
alert(1);
}
});
}
用户确认关闭浏览器后,执行ajax方法,更新online表,插入用户登出时间。
问题:用户点击关闭浏览器后,ajax的方法没有执行,组后输出的1也返回了,然后浏览器关闭。后台的ajax方法时而执行时而不执行,而且是基本不执行。
有朋友遇到过这种情况,知道肿么解决吗。
目前设计已经评审通过,不打算改方法,所以求大神帮助解决ajax不执行的问题。不要提建议说建议不要使用这种方式判断浏览器关闭神马的!谢谢大家
------解决方案--------------------
即使这样的话我觉得也没必要这么做。
你可以用application,服务端的全局变量。 至于时间段的统计,你可以设置个“键”,把一定时间段的放在一个键值对里,把每天(所有的)放在另一个键值对里。这样就可以了,而且方便。 当用户登陆时只要pplication.getAttribute("xxx").add()(假定是放在一个集合里的)。用户退出时,pplication.getAttribute("xxx").remove()。最后你只要统计application中储存的集合中的元素就行。
当然了,如果用户下线是有“显示”行为的(比如点击"退出(注销)")比较好搞,如果是“隐士”行为的(比如直接关闭浏览器)那这个时候你就要再添加一个session销毁的监听器,然后在对应的方法里删除就行了。