當不允許多用戶同時登錄一個帳號時,就需要一種機制,當再登錄一個相同的帳號時,前面登錄的人被擠下線。 原文地址:http://www.cnblogs.com/f23wangj/p/4984302.html 實現原理:在伺服器端記錄登錄的用戶ID+SessionID,當重覆登錄時,根據用戶ID用新的Se ...
當不允許多用戶同時登錄一個帳號時,就需要一種機制,當再登錄一個相同的帳號時,前面登錄的人被擠下線。
原文地址: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裡面。