一个比较精确的“在线用户列表”统计功能

原帖:http://community.csdn.net/Expert/topic/3835/3835032.xml?temp=.1909601 
感谢:Afritxia (能活不易) 


当用户访问网站时,会为他分配一个SessionID。令用户的IP地址和用户名称建立一个一一对应的关系。如果用户开启了新的窗口,则检查用户的IP地址或用户名是否已经在OnlineUsersHash中出现过?如果出现过,就让新的SessionID指向现有的IP地址。而当一个Session结束时,则将该SessionID从OnlineUsers_SessionIPHash中移除。判断是否还有其他SessionID指向这个IP地址,如果没有,那么从在线用户列表中移除用户名称。客户端的情况相当复杂,必须要考虑周全。下面则是新的算法的代码: 

// 在Global.asax.cs 文件中 
// 
// 在线用户列表主键名 
public const string KEY_ONLINEUSERS="OnlineUsers"; 
// 在线用户列表 Session 表主键名 
public const string KEY_ONLINEUSERS_SESSIONIP="OnlineUsers_SessionIP"; 

protected void Application_Start(Object sender, EventArgs e) 
{ 
Application.Lock(); 

Application[KEY_ONLINEUSERS]=null; 
Application[KEY_ONLINEUSERS_SESSIONIP]=null;// 目的是将用户的SessionID和IP对应起来 

Application.UnLock(); 
} 
  
protected void Session_Start(Object sender, EventArgs e) 
{ 
Application.Lock(); 

/*  */

Hashtable onlineUsersHash=(Hashtable)Application[KEY_ONLINEUSERS]; 
Hashtable onlineUsersSessionIPHash=(Hashtable)Application[KEY_ONLINEUSERS_SESSIONIP]; 

if(Visitor.Current.IsGuest)// 如果用户是来宾 
{ 
if(onlineUsersHash.ContainsKey(Request.UserHostAddress)) 
{ 
onlineUsersHash[Request.UserHostAddress]=""; 
} 
else 
{ 
onlineUsersHash.Add(Request.UserHostAddress, ""); 
} 
} 
else 
{ 
if(!onlineUsersHash.ContainsKey(Request.UserHostAddress) 
&& !onlineUsersHash.ContainsValue(Visitor.Current.UserName)) 
{ 
// 如果用户的 IP 地址和用户名称在列表中找不到,则将添加在线用户列表中 
onlineUsersHash.Add(Request.UserHostAddress, Request.Cookies[″UserName″].Value); 
} 
else if(onlineUsersHash.ContainsValue(Request.Cookies[“UserName”].Value)) 
{ 
// 如果用户的 Cookie 信息能够找到,则更新(先删除再添加)在线用户的 IP 地址 
// 
// 说明:用户可能刚登陆不久,便因为线路故障,断线并重新拨号 
// 而当用户回到网站时,用户的 Cookie 还未过期,但是 IP 地址却发生了改变 
string userName=Request.Cookies[″UserName″].Value; 

foreach(object key in onlineUsersHash.Keys) 
{ 
if(((string)onlineUsersHash[key]).Equals(userName)) 
{ 
// 删除用户刚才使用过的 IP 地址 
onlineUsersHash.Remove(key); 
break; 
} 
} 

// 添加在线用户 
onlineUsersHash.Add(Request.UserHostAddress, Request.Cookies[″UserName″].Value); 
} 
else if(onlineUsersHash.ContainsKey(Request.UserHostAddress)) 
{ 
// 如果用户的 IP 地址能找到,则更新在线用户的名称 
// 
// 说明:用户登录后,注销并重新登陆。可能是去换个用户名 
onlineUsersHash[Request.UserHostAddress]=Request.Cookies[″UserName″].Value; 
} 
} 

// 将用户的 IP 地址和 SessionID 对应起来 
if(!onlineUsersSessionIPHash.ContainsKey(Session.SessionID)) 
onlineUsersSessionIPHash.Add(Session.SessionID, Request.UserHostAddress); 

Application.UnLock(); 
} 

protected void Session_End(Object sender, EventArgs e) 
{ 
Application.Lock(); 

if(Application[KEY_ONLINEUSERS]!=null) 
{ 
Hashtable onlineUsersHash=(Hashtable)Application[KEY_ONLINEUSERS]; 
Hashtable onlineUsersSessionIPHash=(Hashtable)Application[KEY_ONLINEUSERS_SESSIONIP]; 

// 获取用户的IP地址 
string IP=(string)onlineUsersSessionIPHash[Session.SessionID]; 

// 移除用户的IP地址 
onlineUsersSessionIPHash.Remove(Session.SessionID); 

// 如果没有一个Session指向这个IP了,则说明这个用户确实已经离开了网站 
// 可以删除该用户的用户名称了 
if(!onlineUsersSessionIPHash.ContainsValue(IP)) 
onlineUsersHash.Remove(IP); 
} 

Application.UnLock(); 
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值