日期:2014-05-17  浏览次数:20608 次

在线人数统计
实现方案。
用户登录时,记录用户信息,存入数据库表(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不执行的问题。不要提建议说建议不要使用这种方式判断浏览器关闭神马的!谢谢大家

------解决方案--------------------
引用:
Quote: 引用:

关闭浏览器你那方法就不靠谱。就算靠谱那断电了你怎么判断?所以你只能改方案!
用session去判断在线人数吧
 我是要统计一天内每个整点(8:00-20:00)在线的人数。然后还有一个功能是统计每天的登录系统的人数。所以当时考虑是建了一张表,登陆系统一个人,就把这个人的信息存到数据库里面,然后这个人登出,就更新表,插入登出时间。最后是查询表去做统计。

即使这样的话我觉得也没必要这么做。
你可以用application,服务端的全局变量。  至于时间段的统计,你可以设置个“键”,把一定时间段的放在一个键值对里,把每天(所有的)放在另一个键值对里。这样就可以了,而且方便。 当用户登陆时只要pplication.getAttribute("xxx").add()(假定是放在一个集合里的)。用户退出时,pplication.getAttribute("xxx").remove()。最后你只要统计application中储存的集合中的元素就行。
当然了,如果用户下线是有“显示”行为的(比如点击"退出(注销)")比较好搞,如果是“隐士”行为的(比如直接关闭浏览器)那这个时候你就要再添加一个session销毁的监听器,然后在对应的方法里删除就行了。