Web 项目中经常遇到的问题就是同一用户名多次登录的问题,网上有许多文章都有描述如何实现该功能,看过之后,想着自己也动手记录一下吧,这里是参考的原文地址:http://www.cnblogs.com/f23wangj/p/4984302.html
实现原理:在服务器端记录登录的用户ID+SessionID,当重复登录时,根据用户ID用新的SessionID替换掉旧的SessionID,在需要单用户登录的操作时就可以判断SessionID是否匹配,不匹配则证明有其他人登录了你的账户,这时可要求重新登录或其他的操作。
实现步骤:1、登录时记录登录的用户ID+SessionID,可利用Application、Cache、数据库等。
2、写一个过滤器用于判断当前的用户ID和SessionID跟服务器记录的是否匹配以及不匹配时进行的操作。
3、在Session过期或者退出系统时释放资源。
步骤一:验证账号密码后,调用下面的方法,用于存储用户ID和sessionID
private void GetOnline(string Name)
{
Hashtable SingleOnline = (Hashtable)System.Web.HttpContext.Current.Application["Online"];
if (SingleOnline == null)
SingleOnline = new Hashtable();
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();
}
步骤二:重写定义过滤器方法,验证该账号是否已经登录
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>alert('您的帐号已在别处登录 ,将被迫下线(请保管好自己的账号密码)!');window.location.href='/Login/Login'</script>" };
}
}
base.OnActionExecuting(filterContext);
}
}
说明:该过滤器用于判断是否存在重复登录的情况,若存在重复登录,则执行if语句内的处理方式,被挤下线,跳转登录页面。(此处的过滤器类似于一个通用类,判断是否登陆)。在涉及视图的控制器方法上方定义使用该过滤器,这样只要刷新视图页面就会调用该方法。
步骤三:在Session过期或者退出系统时释放资源,在Global.asax文件中的Session_End中添加如下代码:
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();
}
上述步骤完成之后,功能已基本实现。上图以示说明:

本文介绍了在Asp.Net MVC中如何实现单点登录,防止同一用户多次登录。主要通过记录用户ID和SessionID,当检测到重复登录时,更新SessionID并进行相应操作。步骤包括登录时记录信息、编写过滤器判断和Session过期后的资源释放。
1408

被折叠的 条评论
为什么被折叠?



