zoukankan
html css js c++ java
一个比较精确的“在线用户列表”统计功能
原帖: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();
}
查看全文
相关阅读:
设计模式 — 结构型模式 装饰者模式
设计模式 — 结构型模式 适配器模式
Java 集合 — HashMap
在Linux(centos)上安装PHP的mongodb扩展 成功试过的
linux一些硬件详情查看的高级方法(网卡,内存,硬盘,cpu)
CentOS系统环境下安装MongoDB
CentOS+Apache+php无法访问redis的解决方法 Redis server went away
如何解决linux下apache启动时httpd: apr_sockaddr_info_get() failed for 报错
修改mysql root密码
win7下 sublime text2操作快捷键
原文地址:https://www.cnblogs.com/kokoliu/p/618143.html
最新文章
作用域与变量提升的面试题方法总结
浅学 Array [数组] 的一些方法(以及跳出循环)
JSON的初步认识
为什么在DOS窗口中使用MySQL时,输入命令后只出现一个箭头,输入什么内容都是这样?
your password has expired.To log in you must change itusing a client that supports expired passwords
怎样理解阻塞非阻塞与同步异步的区别?
出现ERR_SSL_PROTOCOL_ERROR如何解决
nginx: [emerg] bind() to 0.0.0.0:443 failed(98:Address already in use)解决方法
DNS_PROBE_FINISHED_NXDOMAIN错误的解决方法
linux安装nginx并启动https服务协议
热门文章
Linux后台运行java的jar包
linux中启动 java -jar 后台运行程序
linux kill所有Java进程
docker
docker
RocketMQ源码 — 五、 主要feature及其实现方式
RocketMQ源码 — 四、 Consumer 接收消息过程
RocketMQ源码 — 三、 Producer消息发送过程
RocketMQ源码 — 二、 NameServer
RocketMQ源码 — 一、 quikstart
Copyright © 2011-2022 走看看