ASP.NET MVC實現單用戶登陸

如今許多網站都要求登陸後才能進行進一步的操做,當不容許多用戶同時登陸一個賬號時,就須要一種機制,當再登陸一個相同的賬號時,前面登陸的人被擠下線,或者禁止後面的人登陸。這裏實現的是前一種功能。html

網上有許多文章都有描述如何實現該功能,看過以後,想着本身也動手記錄一下吧,這裏是參考的原文地址:http://www.cnblogs.com/f23wangj/p/4984302.html數據庫

實現原理:在服務器端記錄登陸的用戶ID+SessionID,當重複登陸時,根據用戶ID用新的SessionID替換掉舊的SessionID,在須要單用戶登陸的操做時就能夠判斷SessionID是否匹配,不匹配則證實有其餘人登陸了你的帳戶,這時可要求從新登陸或其餘的操做。服務器

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

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

       三、在Session過時或者退出系統時釋放資源。網站

 

步驟1:htm

        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();
        }blog

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

 

步驟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裏面。

總結:基本都是參考大神們的代碼,不過經過本身實踐,也學會了很多東西,在這裏感謝一下那些在網上分享本身心得代碼的朋友,經過上述方法是能夠實現單用戶登陸的功能的,不過性能方面還沒想過會不會有問題,也沒試過用cache等其餘方式如何實現,後續再補充吧。

相關文章
相關標籤/搜索