在线人数统计

yimiyan 2013-11-12 09:10:09
实现方案。
用户登录时,记录用户信息,存入数据库表(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不执行的问题。不要提建议说建议不要使用这种方式判断浏览器关闭神马的!谢谢大家
...全文
318 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
别闹腰不好 2013-11-13
  • 打赏
  • 举报
回复
引用 8 楼 yimiyan 的回复:
引用 6 楼 u012463264 的回复:
用session做也不一定准确,自己评估 哈哈
这个能达到90%以上额准备度问我觉得就可以了!毕竟100%的准确统计也是达不到的!内部系统,不会随随便断电断网的,所以这个可以忽略不计
如果用户不是点击你设定的退出,直接X了浏览器,这时候你的服务器并不知道这个session用户已经退出,还以为他在线。 所以准确度不好说啊
HotWater1991 2013-11-13
  • 打赏
  • 举报
回复
用session统计是可以的,简单的网站统计在线人数,我们是这样做的。
ottorz 2013-11-13
  • 打赏
  • 举报
回复
用session监听器
yimiyan 2013-11-13
  • 打赏
  • 举报
回复
引用 6 楼 u012463264 的回复:
用session做也不一定准确,自己评估 哈哈
这个能达到90%以上额准备度问我觉得就可以了!毕竟100%的准确统计也是达不到的!内部系统,不会随随便断电断网的,所以这个可以忽略不计
yimiyan 2013-11-13
  • 打赏
  • 举报
回复
引用 5 楼 xiaomm627 的回复:
[quote=引用 3 楼 yimiyan 的回复:] [quote=引用 1 楼 huxiweng 的回复:] 关闭浏览器你那方法就不靠谱。就算靠谱那断电了你怎么判断?所以你只能改方案! 用session去判断在线人数吧
我是要统计一天内每个整点(8:00-20:00)在线的人数。然后还有一个功能是统计每天的登录系统的人数。所以当时考虑是建了一张表,登陆系统一个人,就把这个人的信息存到数据库里面,然后这个人登出,就更新表,插入登出时间。最后是查询表去做统计。[/quote] 即使这样的话我觉得也没必要这么做。 你可以用application,服务端的全局变量。 至于时间段的统计,你可以设置个“键”,把一定时间段的放在一个键值对里,把每天(所有的)放在另一个键值对里。这样就可以了,而且方便。 当用户登陆时只要pplication.getAttribute("xxx").add()(假定是放在一个集合里的)。用户退出时,pplication.getAttribute("xxx").remove()。最后你只要统计application中储存的集合中的元素就行。 当然了,如果用户下线是有“显示”行为的(比如点击"退出(注销)")比较好搞,如果是“隐士”行为的(比如直接关闭浏览器)那这个时候你就要再添加一个session销毁的监听器,然后在对应的方法里删除就行了。[/quote]我知道你的意思。可是这和我的需求还有一点不一样。我是只要这个用户登陆系统了,就要存储。时间段的统计,是查询sql来做的。这个说事在线人数统计不太准确,准确的说应该是一个系统流量统计。每天,每个整点,每个中心下的每个区部下的每个团队游多少人使用这个系统。
别闹腰不好 2013-11-13
  • 打赏
  • 举报
回复
用session做也不一定准确,自己评估 哈哈
xiaomm627 2013-11-13
  • 打赏
  • 举报
回复
引用 3 楼 yimiyan 的回复:
[quote=引用 1 楼 huxiweng 的回复:] 关闭浏览器你那方法就不靠谱。就算靠谱那断电了你怎么判断?所以你只能改方案! 用session去判断在线人数吧
我是要统计一天内每个整点(8:00-20:00)在线的人数。然后还有一个功能是统计每天的登录系统的人数。所以当时考虑是建了一张表,登陆系统一个人,就把这个人的信息存到数据库里面,然后这个人登出,就更新表,插入登出时间。最后是查询表去做统计。[/quote] 即使这样的话我觉得也没必要这么做。 你可以用application,服务端的全局变量。 至于时间段的统计,你可以设置个“键”,把一定时间段的放在一个键值对里,把每天(所有的)放在另一个键值对里。这样就可以了,而且方便。 当用户登陆时只要pplication.getAttribute("xxx").add()(假定是放在一个集合里的)。用户退出时,pplication.getAttribute("xxx").remove()。最后你只要统计application中储存的集合中的元素就行。 当然了,如果用户下线是有“显示”行为的(比如点击"退出(注销)")比较好搞,如果是“隐士”行为的(比如直接关闭浏览器)那这个时候你就要再添加一个session销毁的监听器,然后在对应的方法里删除就行了。
超级菜鸟 2013-11-13
  • 打赏
  • 举报
回复
引用 1 楼 huxiweng 的回复:
关闭浏览器你那方法就不靠谱。就算靠谱那断电了你怎么判断?所以你只能改方案! 用session去判断在线人数吧
用session做比较靠谱,写一个sessionlisener,登录跟退出修改session的时候更新在线人数表
Defonds 2013-11-13
  • 打赏
  • 举报
回复
用心跳机制判断在线否。
yimiyan 2013-11-13
  • 打赏
  • 举报
回复
我的这个问题目前算是解决了。今天同事帮我看了一下,是因为我们的系统里面禁用了我的ajax的链接。把链接允许了就可以了!等把这块做完了,放到linux上试试,看有没有问题。谢谢大家了!
yimiyan 2013-11-13
  • 打赏
  • 举报
回复
引用 10 楼 u012463264 的回复:
引用 8 楼 yimiyan 的回复:
[quote=引用 6 楼 u012463264 的回复:] 用session做也不一定准确,自己评估 哈哈
这个能达到90%以上额准备度问我觉得就可以了!毕竟100%的准确统计也是达不到的!内部系统,不会随随便断电断网的,所以这个可以忽略不计
如果用户不是点击你设定的退出,直接X了浏览器,这时候你的服务器并不知道这个session用户已经退出,还以为他在线。 所以准确度不好说啊[/quote]如果用户电价浏览器右上角的X的话,我目前是用onunload监控的。目前来看是可以的,等弄完了部署到linux44.
yimiyan 2013-11-12
  • 打赏
  • 举报
回复
引用 1 楼 huxiweng 的回复:
关闭浏览器你那方法就不靠谱。就算靠谱那断电了你怎么判断?所以你只能改方案! 用session去判断在线人数吧
我是要统计一天内每个整点(8:00-20:00)在线的人数。然后还有一个功能是统计每天的登录系统的人数。所以当时考虑是建了一张表,登陆系统一个人,就把这个人的信息存到数据库里面,然后这个人登出,就更新表,插入登出时间。最后是查询表去做统计。
teemai 2013-11-12
  • 打赏
  • 举报
回复
你这方案都能评审通过,想不明白。。。
teemai 2013-11-12
  • 打赏
  • 举报
回复
关闭浏览器你那方法就不靠谱。就算靠谱那断电了你怎么判断?所以你只能改方案! 用session去判断在线人数吧

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧