如今許多網站都要求登陸後才能進行進一步的操做,當不容許多用戶同時登陸一個賬號時,就須要一種機制,當再登陸一個相同的賬號時,前面登陸的人被擠下線,或者禁止後面的人登陸。這裏實現的是前一種功能。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等其餘方式如何實現,後續再補充吧。