现在许多网站都要求登录后才能进行进一步的操作,当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线,或者禁止后面的人登录。这里实现的是前一种功能。
网上有许多文章都有描述如何实现该功能,看过之后,想着自己也动手记录一下吧,这里是参考的原文地址: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里面。
现在许多网站都要求登录后才能进行进一步的操作,当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线,或者禁止后面的人登录。这里实现的是前一种功能。
网上有许多文章都有描述如何实现该功能,看过之后,想着自己也动手记录一下吧,这里是参考的原文地址: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里面。
|
请发表评论