一个统计当前在线用户的解决方案

原创 2004年12月29日 18:41:00
 

在做一个在线交流的网站时,有个问题很令我头疼,就是关于实时统计在线用户的问题,客户要求:统计当前在线人数、游客人数、会员人数、在线用户列表,包括游客、会员和管理员(如果是游客,则自动生成游客的ID,如果是会员,则显示会员姓名)。因为它要求有实时性,则首先我将用global.asa解决的想法pass掉。

问题的关键是如何判断用户已经离开,和当用户离开时如何执行一个文件或一个函数。

经过和网上一些朋友的探讨,终于解决了这个问题。

解决的原理为:编写一个通用页面,所谓的通用页面,就是应用里的每个页面都包含这个页面,例如:header.asp,在这个页面里,用XMLHTTP写一段代码,这段代码的作用是每隔10秒或20秒就向服务器发送一个请求,目的是更新当前用户的在线时间并删除在线时间超过一定时间的用户,使数据库中的在线用户记录保持一定的实时性。

主要实现方法为:

新建一数据库,字段名称分别为:id(字符),name(字符),user(数字)tt(日期),admin(权限代码,0-普通用户,1-管理员)

表名:online

header.asp ↓

============================================================

<%

... ...

if session("s_in")<>1 and session("s_name")="" then    '如果用户是第一次登陆

 rs.open "select * from online",conn,3,3
  rs.addnew
   rs("id")=session.sessionID
   rs("name")="游客" & session.sessionID
   rs("user")=0      '0表示用户未登陆,是游客身份
   rs("tt")=now
  rs.update
 rs.close
 session("s_in")=1     '设置用户的资料已经存入数据库,表示已经在线
end if

if session("s_name")<>"" then      '如果用户已经通过登录框登录
 rs.open "select * from online where id='" & session.sessionID & "'",conn,3,3
   rs("name")=session("s_name")
   rs("admin")=session("s_admin")    '将用户的姓名更新为会员名称
   rs("user")=1         '表示用户已经登陆,是会员身份
   rs("tt")=now        '将当前系统时间设置为用户的登陆时间
  rs.update
 rs.close
end if

... ...

%>

... ...

<head>

... ...

   <script language=javascript>
    function Test()
    {
    var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");
    xmlhttp.open("POST","onceonline.asp",false);  // 向onceonline.asp发送更新请求
    xmlhttp.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");
    xmlhttp.send();
    }
    setInterval("Test();",10); // 10秒钟发送一次更新请求
   </script>

... ...

</head>

... ...

==========================================================

onceonline.asp

<%
rs.open "select tt from online where id='" & session.sessionID & "'",conn,3,3
rs("tt")=now()        '更新当前在线用户的在线时间
rs.update
rs.close

rs.open "delete from online where datediff('s',tt,now())>60",conn,3,1  '删除超时用户
%>

==============================================================

这样,基本保证了数据库中用户列表的实时性,误差取决于更新时间和删除时间的差值大小和服务器的处理速度,建议不要将删除超时用户的时间间隔取的过于小,那样有可能会导致在线用户0人的失误。

本方案在WIN2000+SQL Server2000上调试通过,由于本方案对系统要求比较大,期待其他朋友拿出更好的方案,一起解决这个问题!

thinkPHP实现在线人数的统计

所以想找一个既能精确统计又能不占用太多服务器资源的方法。先说说一些平常的做法: 一,每次用户操作更新其在线时间 这个方法很直接,在用户表里加一个字段update_time,每次用户进行操作,都更新...
  • u014654942
  • u014654942
  • 2014年11月26日 10:32
  • 1320

java web监听器统计在线用户及人数

在线用户使用HttpSessionListener监听器统计   每当一个session会话建立  在线用户人数+1 每当一个session会话销毁 在线用户人数-1 使用Servlet...
  • su20145104009
  • su20145104009
  • 2016年11月18日 16:04
  • 7418

servlet监听完成统计在线人数,显示在线人员列表(附源码)

ServletContext事件监听器---->针对applicationScope  ServletContextListener(*) 对整个Web应用的装载和卸载进行监听。  ServletCo...
  • weixin_36380516
  • weixin_36380516
  • 2017年04月12日 17:00
  • 1785

如何统计网站的在线人数呢?

如何统计网站的在线人数呢? 首先很简单的思想就是,如果只针对会员用户进行统计,在登录登出时加判断,然后维护一个表(或者其他存储方式)来存储在线会员即可。 但是有个问题就是,对于正常退出的会员当然可...
  • u012639466
  • u012639466
  • 2016年12月13日 23:19
  • 1921

Java监听器学习 统计当前在线人数

javax.servlet.http.HttpSession 这个类是很常用的,每当我们浏览网站,不论有没有登陆,都会产生1个session,它记录了和浏览者相关的数据; 下面介绍session...
  • LiMing_0820
  • LiMing_0820
  • 2016年12月01日 20:23
  • 368

用户在线登录时长统计

突然接到个任务,让统计用户连续在线的时长,写个简单的脚本来做个记录:...
  • yusimiao
  • yusimiao
  • 2014年05月22日 19:12
  • 5805

统计在线用户数以及同账号登录踢出另一用户

写一个session属性监听器:定义两个map,一个存session,以用户编号为key;一个存用户信息,也以用户编号为key.map的个数就是在线用户数.每个用户登录时,先检查map中是否存在,如果...
  • licheng989
  • licheng989
  • 2016年06月03日 17:15
  • 654

实现统计在线用户的几种方式

一,每次用户操作更新其在线时间 这个方法很直接,在用户表里加一个字段update_time,每次用户进行操作,都更新这个字段为当前时间,一般是在一个被所有Action继承的基类里写这个操作。 然后...
  • sb___itfk
  • sb___itfk
  • 2014年09月02日 19:20
  • 2858

asp.net 使用Application和Session对象统计在线人数

asp.net 使用Application和Session对象统计在线人数   使用Application和Session对象,结合全局配置文件Global.asax和站点配置文件Web.confi...
  • alvinfqz
  • alvinfqz
  • 2016年06月03日 09:46
  • 1264

session监听器(可用于统计在线人数,了解系统当前已经登录的使用客户)

session监听器(可用于统计在线人数,了解系统当前的使用客户)博客分类: java浏览器SpringWebBeanServlet★★★ 本篇为原创,需要引用转载的朋友请注明:《 http://st...
  • mywordandyourword
  • mywordandyourword
  • 2014年02月05日 11:01
  • 1221
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个统计当前在线用户的解决方案
举报原因:
原因补充:

(最多只允许输入30个字)