aps .net MVC单用户登录

当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线。

原文地址: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里面。

 

转载于:https://www.cnblogs.com/wslpf/p/10789355.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
using System; using System.Data; using System.Text; namespace ZKXP.BLL { /// /// OnLine 的摘要说明。 /// public class OnLine { private string USERNAME; private int OFFLINEDIFF; private int REMOVEDIFF; public OnLine() { //直接在这里设定、或从配置文件中读取配置参数 ///存放用户名的Session名 USERNAME = "UserName"; ///多少分钟不活动的用户从在线列表中删除 OFFLINEDIFF = 5; ///多少秒执行一次删除不活动用户 REMOVEDIFF = 30; if(System.Web.HttpContext.Current.Application["OnlineTalbe"] == null) { this.CashTableInit(); } } public void CheckOnline() { //从Application获取数据表、获取SessionID DataTable dtOnline; dtOnline = (DataTable)System.Web.HttpContext.Current.Application["OnlineTalbe"]; string sessionId = System.Web.HttpContext.Current.Session.SessionID.ToString(); //数据表中是否有我的记录 DataRow drFind = dtOnline.Rows.Find(sessionId); if(drFind != null) { //有;更新我的状态 Info.Write("更新"); drFind["LastActiveTime"] = DateTime.Now; drFind["UserWhere"] = this.AtWhere; //用户由访客状态变为了登陆会员、或反之 if(Extend.GetSession(USERNAME) != null) { drFind["VisitorName"] = Extend.GetSession(USERNAME); drFind["VisitorLevel"] = Extend.GetSession("UserLevel"); } else { drFind["VisitorName"] = "vst"; drFind["VisitorLevel"] = -1; } } else { //无;加入关于我的在线信息 Info.Write("插入"); DataRow drNew = dtOnline.NewRow(); drNew["SessionID"] = sessionId; drNew["Visit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值