日期:2014-05-18  浏览次数:20470 次

如何能知道指定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 i