如何取得用戶的在線狀態? 比如csdn那樣,在線時就顯示亮的,不在線的就顯示灰的。這個在線狀態如何判斷?請教各位 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以用cookie 这个cookie 不要写到客户端 硬盘上 让这个cookie 保留在内存 然后检查这个cookie 就可以判断 是否在线 也可以参考这办法1. 用Application会好些吧,Cookie在客户端存储统计实现起来比较麻烦. 简单的说: Application["x"]; 只要赋了值,如: Application["x"]; 则甲和已可以共享到此值,可以用于计数器,记录站点访问量 只要一个用户登录,则Application["x"] += 1;//加一个数,表示有个新用户刚刚登录 2. 单独建一张表,字段有:登录时间,退出时间等.用数据库进行记录. 用户上线时,在Global 文件的Session_Begin事件中可以统计 方法太多了,Cookie、Session、Application、Cache、持久到数据库等等,只要你在用户登录时把他的状态记录下来,就可以取得,不论用什么方式什么技术。 KeyWord: 在线 用户 列表 当用户访问网站时,会为他分配一个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(); } 这个在线与否在Web下有两个特点第1,不精确 第2,对资源要求高.我用的是在数据库里记录每个用户最后一次操作的时间,和当前时间比较,如果大于某个值(比如说5分钟)就判断该用户离线.否则在线.当然,如果用户直接点了退出按钮就直接将该时间清空(或用别的标志位,这样可以保留最后时间这个有用的信息). 只要对用户的在线状态进行了维护,就可以获得。而维护用户的在线状态的实现技术很多,比如Cookie、Session、Application、Cache、持久到数据库等等 过去很多很多次了,懒得回答这样的问题了,请google答案。我只提出两点此类问题最起码的需求条件,这是实际的系统都作为“常识”被用户隐含地要求的:1. 用户离线有好多种情况。例如用户访问到其它网站上去了,不再看原来的这个网站的页面了,此时这个网站应该知道用户离线了。另外,浏览器出故障了,或者网络断开了,这在互联网(与一般的c/s应用程序相比)是最常见的事情,网站也应该知道用户离线了。2. 应该在用户离线一分钟之内就记录到服务器,如果过了20分钟才记录(例如此时用户无法再次登录了),或者用户在页面上浏览(发呆)才几分钟就被服务器误认为离线,都是不恰当的。 急!!各位大侠 帮忙推荐几款好的第三方控件 请问如何设置默认保存文件名(JavaScript) 如何查看.net的详细错误信息 如何得到其他用户的session值??? 数据库连接 Web下水晶报表导航条显示问题 弱弱的问:怎样在自定义的类中应用wenform 中的函数 谁有xp风格的下拉菜单样式css或者源代码,请给小弟一份,谢谢 关于教程与实际的区别 请问ASP.NET中的正则表达式的语法和使用方法和php,javascript等中的正则表达式是通用的吗 点击treeview 在ifrmae中显示网页的问题 一个关于IIS的奇怪问题
用Application会好些吧,Cookie在客户端存储统计实现起来比较麻烦.
简单的说:
Application["x"];
只要赋了值,如: Application["x"]; 则甲和已可以共享到此值,可以用于计数器,记录站点访问量
只要一个用户登录,则Application["x"] += 1;//加一个数,表示有个新用户刚刚登录
2.
单独建一张表,字段有:登录时间,退出时间等.用数据库进行记录.
用户上线时,在Global 文件的Session_Begin事件中可以统计
当用户访问网站时,会为他分配一个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();
}
第1,不精确
第2,对资源要求高.我用的是在数据库里记录每个用户最后一次操作的时间,和当前时间比较,如果大于某个值(比如说5分钟)就判断该用户离线.否则在线.当然,如果用户直接点了退出按钮就直接将该时间清空(或用别的标志位,这样可以保留最后时间这个有用的信息).