当前位置: 代码迷 >> ASP.NET >> 实现一个账号只能在一个客户端登录,像QQ登录一样的效果解决办法
  详细解决方案

实现一个账号只能在一个客户端登录,像QQ登录一样的效果解决办法

热度:7304   发布时间:2013-02-25 00:00:00.0
实现一个账号只能在一个客户端登录,像QQ登录一样的效果
实现一个账号只能在一个客户端登录,像QQ登录一样的效果!当一个账号已经在一个客户端登录后,然后在第二个客户端再用同一个账号登录时,第一个客户端掉线

例如:
  admin 在A客户端登录。
  B客户端也用admin登录。
  这时候,A客户端出现admin账号在别的地方登录的提示,并掉线


不要思路。给个简单的实现代码

------解决方案--------------------------------------------------------
MARK ~
------解决方案--------------------------------------------------------
这种事情,别人只能给思路,而不是代码。

服务器端记录当前登录状态,如果用户已登录,则向第一个登录发送消息,迫使它下线。
------解决方案--------------------------------------------------------
登录的时候
hash["a"] = a_ip;


在httpmodule里对每个请求检查:hash["a"]=当前IP,正常,否则,就提示下线,并执行下线操作。
------解决方案--------------------------------------------------------
scoket维护用户列表

上线,下线,是否登陆维护.
------解决方案--------------------------------------------------------
C# code
if (UserIsOnline(adminName))            {               ...........                           }    /// <summary>    /// 获取或设置在线列表    /// </summary>    public Hashtable OnlineUserList    {        get        {            if( HttpContext.Current.Application["OnlineUserList"] == null)            {                Hashtable onlineUserList = new Hashtable();                HttpContext.Current.Application["OnlineUserList"] = onlineUserList;            }            return (Hashtable)HttpContext.Current.Application["OnlineUserList"];        }        set        {            HttpContext.Current.Application["OnlineUserList"] = value;        }    }    /// <summary>    /// 添加在线成员    /// </summary>    /// <param name="key"></param>    /// <param name="value"></param>    /// <returns></returns>    public bool OnlineUserList_Add(string key,string value)    {        try        {            if (OnlineUserList.Contains(key))                OnlineUserList[key] = value;            else                OnlineUserList.Add(key, value);            return true;        }        catch        {            return false;        }    }    /// <summary>    /// 添加在线成员    /// </summary>    /// <param name="key"></param>    /// <param name="value"></param>    /// <returns></returns>    public bool OnlineUserList_Add(string key)    {        string value = DateTime.Now.ToString();        return   OnlineUserList_Add(key, value);    }    public bool OnlineUserList_Delete(string key)    {        bool re = false;        if (OnlineUserList.Contains(key))        {            Hashtable userList = OnlineUserList;            userList.Remove(key);            OnlineUserList = userList;            return true;        }        return re;    }    /// <summary>    /// 判断用户是否在线    /// </summary>    /// <param name="adminName"></param>    /// <returns></returns>    public bool UserIsOnline(string adminName)    {        OnlineClearUserOutTimeInOnLineList();        return OnlineUserList.Contains(adminName) ? true : false;    }    /// <summary>    /// 删除超时在线用户    /// </summary>    public void OnlineClearUserOutTimeInOnLineList()    {        Hashtable list = new Hashtable();        Hashtable temList = new Hashtable();        list = OnlineUserList;        temList = new Hashtable(list);        foreach (DictionaryEntry de in temList)        {            //删除超时            DateTime onlineTime = DataConverter.StrToDateTime( de.Value, DateTime.Now);            TimeSpan timeSpan = DateTime.Now - onlineTime;            //在线时间和当前时间间隔大于超时分钟数就删除(注:用户非法关闭浏览器)            if (timeSpan.TotalMinutes >= (double) OnlineTimeOut)            {                list.Remove(de.Key);            }        }        OnlineUserList = list;    }
  相关解决方案