当前位置: 代码迷 >> ASP.NET >> 怎么能知道指定Session用户当前是否在线
  详细解决方案

怎么能知道指定Session用户当前是否在线

热度:5181   发布时间:2013-02-25 00:00:00.0
如何能知道指定Session用户当前是否在线
比如我如何能知道Session["nickName"]="YaYa" 的用户当前是否已经登录在我的网站上了····

------解决方案--------------------------------------------------------
HTTP协议注定无法直接实现你的要求。

办法有,但非常不值得。

比如把session超时设置为10s,然后在客户端使用ajax定时访问某个特定页面,在该页面更新session .

服务器性能消耗会提高不少。
------解决方案--------------------------------------------------------
你的网站的每个页面载入时都把刚但session指定的用户/当前时间写入数据库.
你要判断的时候判断这个用户对应的最后活动时间(一般10-20分钟内都作为在线),但这样显然不会很准,但一般的论坛/网站之类的这样的精度就可以了
------解决方案--------------------------------------------------------
1.用反射的法子,来遍历session,但这个法子走的是偏门
2.建立和撤销session的时候,维护一个列表,这样查表就知道了
------解决方案--------------------------------------------------------
if(Session["nickName"]!=null)
{
if(Session["nickName"].ToString() = "YaYa")
}
这样子行不行
------解决方案--------------------------------------------------------
用cookies呢,原理和session差不多,
------解决方案--------------------------------------------------------
没做过,系统能读用户的Session信息吗?
关注,学习一下
------解决方案--------------------------------------------------------
让客户端反应到的你的网站上,而不是你主动去探
------解决方案--------------------------------------------------------
不懂,关注,学习...
------解决方案--------------------------------------------------------
帮顶,关注!
似乎7楼说的有点道理!
------解决方案--------------------------------------------------------
.........
------解决方案--------------------------------------------------------
期待
------解决方案--------------------------------------------------------
比如我如何能知道Session["nickName"]="YaYa" 的用户当前是否已经登录在我的网站上了····

if(Session["nickName"]!=null) 

if(Session["nickName"].ToString() = "YaYa") 

应该就是这意思呀
------解决方案--------------------------------------------------------
好像不行,再有用户登录Session值就变了,还是把值存到一个表或string类型数组里,然后在他推出的时候将其名再删除,这样遍历表或数组就能知道了
------解决方案--------------------------------------------------------
我的经验是自己写一个统计类(单态容器类),在Session_Start()和Login()中添加容器中的Session信息,在获取Session信息时更新容器中对应Session条目的最近活动时间,在Logout中删除容易中相应的Session条目,另外容器类提供相关函数来统计当前在线的情况,还要考虑到如果容器中的某个Session长时间未活动,那么得有超时机制来处理。

C# code
/// <summary>/// 在线用户信息管理类/// </summary>public class OnlineManage{    private static OnlineManage _instance = new OnlineManage();    //private Dictionary<int, OnlineUserInfo> _onlineUserList = new Dictionary<int, OnlineUserInfo>();    private Dictionary<string, OnlineUserInfo> _onlineSession = new Dictionary<string, OnlineUserInfo>();    public const int Timeout_Minutes = 20;  //非登录会员在线用户过期时间    public const int Timeout_Minutes_Member = 40; //登录会员在线过期时间    private OnlineManage()    {    }    public void Clear()    {        lock(this)        {            //_onlineUserList.Clear();            _onlineSession.Clear();        }    }    /// <summary>    /// 获取当前在线用户总数(包含登录和未登录的)    /// </summary>    public int Count    {        get { return _onlineSession.Count; }    }    /// <summary>    /// 在线会员数    /// </summary>    public int MemberCount    {        get        {            int iRet = 0;            lock(this)            {                foreach (string _sKey in _onlineSession.Keys)                {                    OnlineUserInfo oInfo = _onlineSession[_sKey];                    if (oInfo == null)                    {                        _onlineSession.Remove(_sKey);                    }                    else                    {                        if (oInfo.UserID>0)                        {                            iRet++;                        }                    }                }            }            return iRet;        }    }    public OnlineUserInfo this[int UserID]    {        get        {            lock(this)            {                foreach (string _sKey in _onlineSession.Keys)                {                    OnlineUserInfo oInfo = _onlineSession[_sKey];                    if (oInfo == null)                    {                        _onlineSession.Remove(_sKey);                    }                    else                    {                        if (oInfo.UserID == UserID)                        {                            return oInfo;                        }                    }                }                return null;            }        }    }    public OnlineUserInfo this[string sSessionID]    {        get        {            if (_onlineSession.ContainsKey(sSessionID))                return _onlineSession[sSessionID];            else                return null;        }    }    /// <summary>    /// 获取所有当前在线用户的ID数组    /// </summary>    public int[] OnlineUserIDs    {        get        {            lock(this)            {                List<int> ids = new List<int>();                foreach(string _sKey in _onlineSession.Keys)                {                    OnlineUserInfo oInfo = this[_sKey];                    if(oInfo!=null && oInfo.UserID>0)                    {                        ids.Add(oInfo.UserID);                    }                }                return ids.ToArray();            }        }    }    /// <summary>    /// 用户有活动,存在异常情况:    /// 1. Session未结束,但是换了用户登录    /// </summary>    /// <param name="UserID"></param>    public void UserActived(string sSessionID,int iUserID)    {        lock (this)        {            OnlineUserInfo oInfo = this[sSessionID];            if (oInfo == null)            {                oInfo = new OnlineUserInfo(sSessionID, iUserID);                _onlineSession.Add(sSessionID, oInfo);            }            else            {                if(oInfo.UserID != iUserID) //考虑同一个页面先后用别的帐号登录                {                    oInfo.UserID = iUserID;                    oInfo.LoginTime = DateTime.Now;                }                oInfo.LastActiveTime = DateTime.Now;            }        }    }    /// <summary>    /// 用户离开(未活动时间超时或者用户注销了)    /// </summary>    /// <param name="UserID"></param>    public void UserLeaved(string sSessionID,int iUserID)    {        lock(this)        {            _onlineSession.Remove(sSessionID);        }    }    /// <summary>    /// 用户离开(未活动时间超时或者用户注销了)    /// </summary>    /// <param name="sSessionID"></param>    public void UserLeaved(string sSessionID)    {        lock (this)        {            _onlineSession.Remove(sSessionID);        }    }    /// <summary>    /// 检查在线用户状态,如果发现有超时未活动的用户,将其删除    /// </summary>    public void CheckOnlineUsers()    {        lock(this)        {            //1.先查询出需要删除的Key列表            List<string> _removeKeys = new List<string>();            foreach (KeyValuePair<string, OnlineUserInfo> kvp in _onlineSession)            {                OnlineUserInfo oInfo = kvp.Value;                string _sKey = kvp.Key;                if(oInfo == null)                {                    _removeKeys.Add(_sKey);                }                else                {                    if(oInfo.UserID>0) //登录会员                    {                        if (oInfo.NoActiveMinutes > Timeout_Minutes_Member)                        {                            _removeKeys.Add(_sKey);                        }                    }                    else //未登录会员                    {                        if (oInfo.NoActiveMinutes > Timeout_Minutes)                        {                            _removeKeys.Add(_sKey);                        }                    }                }            }            //2.从容器中删除这些Key            foreach (string _key in _removeKeys)            {                _onlineSession.Remove(_key);            }            _removeKeys.Clear();        }    }    /// <summary>    /// 获取唯一实例    /// </summary>    /// <returns></returns>    public static OnlineManage GetInstance()    {        return _instance;    }}/// <summary>/// 在线用户信息类/// </summary>public class OnlineUserInfo{    public int UserID;    public string SessionID;    public DateTime LoginTime;    public DateTime LastActiveTime;    /// <summary>    /// 构造函数,用于用户新登录时创建用户在线条目    /// </summary>    /// <param name="iUserID">活动的用户ID</param>    /// <param name="dtLoginTime">用户活动时间</param>    public OnlineUserInfo(int iUserID,DateTime dtLoginTime)    {        UserID = iUserID;        SessionID = "";        LoginTime = dtLoginTime;        LastActiveTime = dtLoginTime;    }    /// <summary>    /// 构造函数,用于用户新登录时创建用户在线条目    /// </summary>    /// <param name="iUserID">活动的用户ID</param>    /// <param name="dtLoginTime">用户活动时间</param>    public OnlineUserInfo(string sSessionID, int iUserID)    {        UserID = iUserID;        LoginTime = DateTime.Now;        LastActiveTime = DateTime.Now;        SessionID = sSessionID;    }    /// <summary>    /// 用户初次进来并创建了新Session    /// </summary>    /// <param name="sSessionID"></param>    public OnlineUserInfo(string sSessionID)    {        UserID = 0;        LoginTime = DateTime.Now;        LastActiveTime = DateTime.Now;        SessionID = sSessionID;    }    /// <summary>    /// 获取该用户的未活动时长(分钟数)    /// </summary>    public int NoActiveMinutes    {        get        {            TimeSpan dtSpan = DateTime.Now.Subtract(LastActiveTime);            return (int)dtSpan.TotalMinutes;        }    }    /// <summary>    /// 获取该用户的在线时长(分钟数)    /// </summary>    public int OnlineMinutes    {        get        {            TimeSpan dtSpan = DateTime.Now.Subtract(LoginTime);            return (int)dtSpan.TotalMinutes;        }    }}
------解决方案--------------------------------------------------------
该结贴给分了
------解决方案--------------------------------------------------------
http://blog.csdn.net/xiyongjie/archive/2008/10/13/3068682.aspx
这个Blog里给了完整的处理方法,可以参考下~
------解决方案--------------------------------------------------------
探讨
比如我如何能知道Session["nickName"]="YaYa" 的用户当前是否已经登录在我的网站上了····

if(Session["nickName"]!=null)
{
if(Session["nickName"].ToString() = "YaYa")
}
应该就是这意思呀

------解决方案--------------------------------------------------------
15楼的方法收藏了
------解决方案--------------------------------------------------------
学习
------解决方案--------------------------------------------------------
探讨
1.用反射的法子,来遍历session,但这个法子走的是偏门
2.建立和撤销session的时候,维护一个列表,这样查表就知道了

------解决方案--------------------------------------------------------
if(Session["nickName"]!=null) 

if(Session["nickName"].ToString() = "YaYa") 

这样试试
------解决方案--------------------------------------------------------
怎么,还没结贴吗?
------解决方案--------------------------------------------------------
思路:
数据存储:使用静态变量或者application,大的话可以使用数据库或者xml文件保存
用户登陆即写入,用户登出即删除
用户在线时,定期(比如一分钟)更新最后在线时间
用一个专门的线程来判断用户是否断线超时,如果现在的时间和最后在线时间超过了1分钟,则可认为用户已经不正常退出

  相关解决方案