[讨论]发现很多人问如何显示在线人数,和所在位置,我提种方法供大家讨论:

yangzixp 2004-12-01 01:19:04
加精
/*
本文属作者原创,请尊重作者劳动成功,转载和使用注明出处
作者:子扬
联系方式:QQ:21112856
网站:www.25bz.com
MSN: zjgzkq(at)hotmail(dot)com
*/

一、原理
在.net中的global.asax中有Application_AuthenticateRequest事件和Application_BeginRequest事件是在每次访问aspx文件都会触发。但是Application_BeginRequest中不能对已经经过FROMS身份验证的身份ticket票进行识别。所以只能放到Application_AuthenticateRequest中去。

我的实现原理是:每次访问aspx文件时候都会判断在线表里面是否有这个用户(已经登录了的记录用户名,没有登录的记录IP地址),如果不存在,则将该用户的身份、最后访问时间、最后访问IP、和最后访问的URL存入数据库。如果数据库中已经曾在,则更新该记录,把最后访问时间,IP以及最后访问URL更新。

同时,删除数据库中与当前时间间隔20分钟以上的数据(20分钟没操作当为超时)。

二、优点
这样,你不仅仅可以看到当前在线的准确人数,还知道是那些人在线,以及是否登陆,和访问人数中已经是会员的比例,以及所在位置,并计算某个页上的人数。

三、数据库结构:
主键 字段 类型 长度 是否为空 说明
1 uson_serial int 4 0 序号
0 uson_user varchar 20 0 用户名(没登陆则为IP)
0 uson_company varchar 100 0 公司名(没登陆则为'游客')
0 uson_ip varchar 20 0 IP地址
0 uson_date datetime8 0 最后操作时间
0 uson_url varchar 100 0 最后操作页面路径

四、程序
注意:
1、程序位于global.asax中
2、我是使用的FORMS身份验证
3、请using System.Web.Security

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
string strUserID = string.Empty;
string strCompany = string.Empty;
if (Request.IsAuthenticated)
{
FormsIdentity identity = (FormsIdentity)User.Identity;
FormsAuthenticationTicket ticket = identity.Ticket;
strUserID = User.Identity.Name;
strCompany = ticket.UserData.Split("|".ToCharArray())[2];
}
else
{
strUserID = Request.UserHostAddress;
strCompany = "游客";
}

MemberOnlineInfo objOnline = new MemberOnlineInfo(strUserID, Request.UserHostAddress, DateTime.Now.ToString(), Request.FilePath, strCompany);

MemberAccount account = new MemberAccount();
if (!account.CheckUserOnline(strUserID))
account.AddOnline(objOnline);
else
account.UpdateOnline(objOnline);

//删除超时的会员
account.DeleteOnline();
}
...全文
882 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
hiying 2004-12-02
  • 打赏
  • 举报
回复
哦,understand.

俺想的是在asp下的实现,呵呵,asp里面没有Application_BeginRequest这个事件。

多谢
yangzixp 2004-12-02
  • 打赏
  • 举报
回复
TO:hiying
你这样要每个页里都要包含一个页刷新?
我这个不需要每个页都处理啊。只需要放在Global.asax中就可以了。
lvzhizhu 2004-12-02
  • 打赏
  • 举报
回复
up
leisang 2004-12-02
  • 打赏
  • 举报
回复
能不能不用数据库?
hiying 2004-12-02
  • 打赏
  • 举报
回复
Mark.

我以前也是这样写的,但是我是固定在一个页面里,这个页面定时刷新。
没有搂住这个方法好,但是我的简单,只需一个文件。
搂住的要在多个文件里操作。
gxh973121 2004-12-02
  • 打赏
  • 举报
回复
mark
yangzixp 2004-12-01
  • 打赏
  • 举报
回复
怎么将帖子加入FAQ?
yangzixp 2004-12-01
  • 打赏
  • 举报
回复
srz007(呵呵):
学了很多。感谢!
完善一下。增加一个字段记录开发访问时间,然后相减。可以得到停留时间。
nga96 2004-12-01
  • 打赏
  • 举报
回复
不会,呵
srz007 2004-12-01
  • 打赏
  • 举报
回复
你可以把在线这个操作的数据库放在access中,取得客户端可以用cookie的方法来区别,cookie的值保存其第一次访问时的SessionId加上其Ip地址的组合字符,就不会产生歧义了,如果这个用户再次访问就不赋这个cookie值了,我也在制作中,有些思路可能不大有条理,做完再理清些吧
yangzixp 2004-12-01
  • 打赏
  • 举报
回复
我的意思是同一IP中多个人如果都没登陆则做为一个用户处理。
如果登陆了。还是会作为不同用户处理的。
yangzixp 2004-12-01
  • 打赏
  • 举报
回复
To: sykpboy
确实如此。不过如果不通过IP。通过什么呢?硬盘序列号?呵呵。这就更麻烦了。
flcandclf 2004-12-01
  • 打赏
  • 举报
回复
protected void Session_Start(Object sender, EventArgs e)可以在这个函数里写上线的程序,在protected void Session_End(Object sender, EventArgs e)函数里写下线的程序
sykpboy 2004-12-01
  • 打赏
  • 举报
回复
2、同一IP的多个人当作一个人处理。----这是一个很大的问题,对于企业用户,或者机关、学校等。一般都是一大群人使用一个IP的,所以根据IP判断不合适。
real0411 2004-12-01
  • 打赏
  • 举报
回复
Mark!
yangzixp 2004-12-01
  • 打赏
  • 举报
回复
错了。不是数据库访问很大。是数据库很大。日志也会很大。
yangzixp 2004-12-01
  • 打赏
  • 举报
回复
srz007:
老兄说得很有道理。不过这样数据库访问就很大了啊。
srz007 2004-12-01
  • 打赏
  • 举报
回复
我现在也在做这个东西,不过我的理解就是在线人数一说并不准确,应该叫做 在过去的XX时间内有多少人访问了网站 才对,在每一次对网站的请求时都记录访问者的相关信息,和你的思路一样,但并不去删除过期的数据,因为这些数据可以用来做网站访问统计的数据来源,由于数据是存在数据库中的,显示所谓的在线人数只不过是选取最新的 XX 条数据而已,并没有什么压力,如果这样考虑的话做在线人数是很简单的了
cuipeng99 2004-12-01
  • 打赏
  • 举报
回复
一次会除去相同IP的所有人
q_po_o 2004-12-01
  • 打赏
  • 举报
回复
jxgz
加载更多回复(16)

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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