浏览器关闭监听/统计在线用户问题

linyfei 2014-11-04 05:03:49
简单需求:A打开浏览器(ie/chrome/firefox等主流浏览器)登录B系统,server端在线用户数count +1 ,那么关闭浏览器时,send Ajax request 通知server端count-1(浏览器记住密码,有效期2周);

想法:监听浏览器的关闭事件,在网上查看各种资料提到unload() / onbeforeunload() 函数,也有提到自己写心跳 。

问题:
心跳会增加我们的服务器压力,而且心跳的触发也是个问题;
unload()/unbeforeunload() 的提示不友好而且会重复2次,同时在发送ajax时很有可能会造成页面假死情况


参考网站:http://www.blogjava.net/sslaowan/articles/355575.html
http://www.iteye.com/problems/63413

提问:谁有什么好的建议能更好的解决这个问题?
...全文
299 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
前台每个页面增加一个“setInterval”,每隔30秒向后台发送一个心跳请求; 后台定义一个静态map,key是用户名(唯一),value是用户最后一次心跳请求时间(用时间戳); 每次心跳请求都刷新map中的该用户的心跳请求时间; 后台统计就简单了, 遍历map,判断心跳时间,时间比当前时间早2分钟(自己设置,最少大于30秒),就认为该用户离线了,不统计在在线用户中,甚至可以从map中移除了。
linyfei 2014-11-05
  • 打赏
  • 举报
回复
引用 3 楼 maihao110 的回复:
1、关闭浏览器的方式很多,所以unload()/unbeforeunload() 就别考虑了; 2、1楼的方法没有解决问题,也不用考虑了; 3、心跳是可行的,但你有俩问题: 3-1、怕增加服务器压力? 这个你最好测试一下,压力会有但肯定不大,浏览器定时发请求,服务端只是很简单的处理,又不涉及数据库操作,基本没 啥压力; 3-2、心跳触发问题,没明白 心跳会有什么触发问题?! 采用心跳方式,就不需要server端count+-这种操作,每次重新获取一次在线用户集合大小就可以了。
“采用心跳方式,就不需要server端count+-这种操作,每次重新获取一次在线用户集合大小就可以了。” 能否具体说明下,我理解是每次客户端发生动作便发送一个请求给服务端,服务端接收该请求同时记录当前动作更新时间,server端增加一个心跳检测,例如每隔1h将用户动作更新时间与当前时间进行比对,大于1h则说明已经离线,否则在线。但我感觉我的理解和你想表达的意思是不同的,能否再次请教下您?
yicheng099 2014-11-05
  • 打赏
  • 举报
回复
就只是实时统计用户在线,又没有什么复杂业务逻辑,用不着考虑考虑什么服务器压力问题,把请求时间间隔适当加大
  • 打赏
  • 举报
回复
1、关闭浏览器的方式很多,所以unload()/unbeforeunload() 就别考虑了; 2、1楼的方法没有解决问题,也不用考虑了; 3、心跳是可行的,但你有俩问题: 3-1、怕增加服务器压力? 这个你最好测试一下,压力会有但肯定不大,浏览器定时发请求,服务端只是很简单的处理,又不涉及数据库操作,基本没 啥压力; 3-2、心跳触发问题,没明白 心跳会有什么触发问题?! 采用心跳方式,就不需要server端count+-这种操作,每次重新获取一次在线用户集合大小就可以了。
linyfei 2014-11-05
  • 打赏
  • 举报
回复
引用 1 楼 xzy21com 的回复:
不建议监听页面。 可考虑更新用户操作时间,每个动作更新一下在线时间,超过一定时间没更新就当离线处理。原理就像电脑自动进入屏保一样。
能说明下不建议监听页面有哪些出发点或者顾虑么? 另外更新用户操作时间,我理解为监听页面的点击事件(发生点击,传送一个请求给server更新用户操作时间),server端进行心跳检测。但是如此会加重我们的服务器压力,您觉得呢?
scscms太阳光 2014-11-04
  • 打赏
  • 举报
回复
不建议监听页面。 可考虑更新用户操作时间,每个动作更新一下在线时间,超过一定时间没更新就当离线处理。原理就像电脑自动进入屏保一样。

87,920

社区成员

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

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