我要的是web上的,多台电脑上,比如,A电脑登陆,B电脑则不能登陆或者A电脑被挤下线。

解决方案 »

  1.   

    那你搞一下存在数据库中的Session.
      

  2.   

    在数据库的用户表中记录下LastSessionId,保存最近登录的会话id。
    登录的时候更新它。
    访问一切资源的时候判断,这个SessionID和当前的是不是一样,如果不同,说明后面又登录了,于是当前用户下线。
      

  3.   

    @devmiao 访问一切资源都要判断,这样会不会太麻烦了。
      

  4.   

    你要在内部维护一个已登录用户的字典表,这个字典用SessionID作键,用户ID作值。如果再有用户登录进来,根据新登录的用户ID,把原有相同ID的用户信息从登录字典表清除掉。
    当原有用户根据原有的SessionID再次访问时,因找不到自己的Key,系统提示你已经被挤下来了。
    如果不让新用户登录。则更简单。
    这个mvc原生的登录是不支持的,你必须另写自己的登录逻辑。
      

  5.   

    这是我从网上找的代码,稍加整理,在登陆时,调用此方法,但是不知道为什么没效果?  
     public void PreventRepeatLogin(FormCollection collection)
            {
                string username = collection["username"];
                User user = this.userRespository.Single(t => t.Username == username);            //防止用户同时登陆
                if (username != "")
                {
                    Hashtable h = (Hashtable)HttpContext.Cache.Get("online");
                    if (h != null)
                    {
                        IDictionaryEnumerator el = h.GetEnumerator();
                        bool flag = false;
                        while (el.MoveNext())//循环遍历查找该用户
                        {
                            if (el.Value.ToString()==username) //需正常退出,释放session
                            {//找到用户
                                flag = true;
                                break;
                            }
                        }
                        if (flag)//找到用户
                        {
                            username = "";
                            //提示登录失败,已登录
                            return;
                        }
                        else
                        {
                            if (user.Username == username)
                            {
                                h.Add(Session.SessionID, Session["userid"]);
                                HttpContext.Cache.Insert("online", h);
                            }
                        }
                    }
                    else
                    {
                        if (user.Username ==username)
                        {
                            h.Add(Session.SessionID, Session["userid"]);
                            HttpContext.Cache.Insert("online", h);                    
                           
                        }
                    }
                }
            }
    ————————————————
    这是注销时的对Session释放的代码 
    //[HttpPost]
            public ActionResult Logout()
            {
                LogoutCache();
                LoginHelper.Logout();
                Session.Abandon();
                return RedirectToAction("Login", "Account");
            }        public void LogoutCache()
            {
                Hashtable h = (Hashtable)HttpContext.Cache["online"];
                if (h != null)
                {
                    if (h[Session.SessionID] != null)
                    {
                        h.Remove(Session.SessionID);
                        HttpContext.Cache.Insert("online", h);
                    }
                }
    ————————————求解?
      

  6.   

    今天调试了,Session还是不行,采用了另一种方法:
    逻辑:用一个登陆时在线时的时间和当前时间做对比,这个登陆时的在线时间通过页面异步刷新,不断更新时间(这个页面必须是模板页面,即所有其他页面都要加载的页面)。逻辑:用一个登陆时在线时的时间和当前时间做对比,这个登陆时的在线时间通过页面异步刷新,不断更新时间.这个页面必须是模板页面,即所有其他页面都要加载的页面。具体步骤:
    1.在用户表中添加LastOnLine,并初始化LastOnLine字段:___________________________________
    2.在登陆时用当前时间和LastOnLine 中的时间比较:
    注意在登陆成功之后再更新下LastOnLine字段,防止页面刷新的时间间隔内可以同时登陆;
    判定:当前时间+3分钟 >现在时间,则认为还在线,否则认为退出了;
    ————————————————
    3.正常退出时,将LastOnLine 字段时间设置为最小,这样下次可以即刻登陆,不用等待3分钟:
    另外要捕捉异常,防止页面超时情况出现,不能正常退出,仍要等待:4.页面异步刷新代码:5.前台脚本代码:
    注意这个页面必须是模板页面,也就是每个页面都要加载的页面才行;