aps .net MVC單用戶登錄


當不允許多用戶同時登錄一個帳號時,就需要一種機制,當再登錄一個相同的帳號時,前面登錄的人被擠下線。

原文地址:http://www.cnblogs.com/f23wangj/p/4984302.html

實現原理:在服務器端記錄登錄的用戶ID+SessionID,當重復登錄時,根據用戶ID用新的SessionID替換掉舊的SessionID,在需要單用戶登錄的操作時就可以判斷SessionID是否匹配,不匹配則證明有其他人登錄了你的賬戶,這時可要求重新登錄或其他的操作。

實現步驟:1、登錄時記錄登錄的用戶ID+SessionID,可利用Application、Cache、數據庫等。

     2、寫一個過濾器用於判斷當前的用戶ID和SessionID跟服務器記錄的是否匹配以及不匹配時進行的操作。

       3、在Session過期或者退出系統時釋放資源。

步驟1:

        private void GetOnline(string Name)
        {
            Hashtable SingleOnline = (Hashtable)System.Web.HttpContext.Current.Application["Online"];
            if (SingleOnline == null)
                SingleOnline = new Hashtable();

            Session["mySession"] = "Test";
            //SessionID
            if (SingleOnline.ContainsKey(Name))
            {
                SingleOnline[Name] = Session.SessionID;
            }
            else
                SingleOnline.Add(Name,Session.SessionID);

            System.Web.HttpContext.Current.Application.Lock();
            System.Web.HttpContext.Current.Application["Online"] = SingleOnline;
            System.Web.HttpContext.Current.Application.UnLock();
        }

說明:登錄時將用戶名(唯一標識符即可)傳給該方法,該方法實現記錄用戶ID以及SessionID

 

步驟2:

  public class LoginActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Hashtable singleOnline = (Hashtable)filterContext.HttpContext.Application["Online"];
            // 判斷當前SessionID是否存在
            if (singleOnline != null && singleOnline.ContainsKey(filterContext.HttpContext.User.Identity.Name))
            {
                if (!singleOnline[filterContext.HttpContext.User.Identity.Name].Equals(filterContext.HttpContext.Session.SessionID))
                {
                    filterContext.Result = new ContentResult() { Content = "<script>if(confirm('你的賬號已在別處登陸,是否返回登陸頁面重新登陸?')){window.location.href='/Authentication/Login';}else{window.close();}</script>" };
                }
            }
            base.OnActionExecuting(filterContext);
        }
    }
說明:該過濾器用於判斷是否存在重復登錄的情況,過濾器怎么用這里就不多說了,若存在重復登錄,則執行if語句內的處理方式,這里的處理方式是彈出個確認框,當然你也可以直接跳轉到登錄地址,看需要更改。

 

步驟3:

        protected void Session_End()
        {
            Hashtable SingleOnline = (Hashtable)System.Web.HttpContext.Current.Application["Online"];
            if (SingleOnline != null && SingleOnline[User.Identity.Name] != null)
            {
                SingleOnline.Remove(Session.SessionID);
                System.Web.HttpContext.Current.Application.Lock();
                System.Web.HttpContext.Current.Application["Online"] = SingleOnline;
                System.Web.HttpContext.Current.Application.UnLock();
            }
            Session.Abandon();
        }

說明:用於釋放資源,該方法放置在Global.asax里面。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM