防止同一用户同时登陆的实现[单WEB服篇]

 

背景:

功能像咱俩上同一个QQ号,你先上去了,然后我用同样的号登陆,你的肯定就掉线了,就是这个功能.

  该方案只考虑了WEB服务器为一台的情况.多台以后再写一篇.

思路

记录用户登陆信息[登陆时间,用户ID]

每隔一段时间(如5秒怎么样?)检查存储的登陆信息。如果发现多个,则比较各个的登陆时间,如果自己用的登陆时间比其他的早,则提示并注销。

 

实现:

1.把所有登陆用户存在这个全局Application中(建议把这个Application放在基类,方便调用):

protected IList<IList> LoginInfo

        {

            get

            {

                if (Application["loginInfo"] == null)

                {

                    Application["loginInfo"] = new List<IList>();

                }

                return (IList<IList>)Application["loginInfo"];

            }

        }

 

 

 

 

用户成功登陆时,保存登陆的用户名与登陆时间:

DateTime dt = DateTime.Now;

//这里保存当前用户的登陆状态,保存登陆信息,此处伪代码,存储可以用Session存储用户实体类,下面会用到.

 

Session[“UserInfo”] = user.GetUserInfoByUName(userName, ref error);

Session[“LastLoginDate”].LastLoginDate = dt;

 

//这里把该用户名与登陆时间存到登陆用户列表中:

IList al = new ArrayList();

//这里我加的是用户名,因为这里是用用户名做主键的,其实用int更好.如果你是用int做用户主键,请用userid.
al.Add(txtUserName.Text);

al.Add(dt);

LoginInfo.Add(al);

 

 

页面里增加脚本,每隔一段时间(5秒)取一下状态,看看这个用户名是不是在其他地方登陆了,这里用到了prototypeajax

<script language='javascript' type='text/javascript'>"

function ValidSimpleUser()

{

new Ajax.Request('LeadNT.aspx?op=otherLogin',

{onSuccess: function(transport)

{

if(transport.responseText == 1')

top.location.href=''LeadNT.aspx?op=logout';}

});

}

setInterval('ValidSimpleUser();',5000);

</script>

 

 

脚本中用到了一个页面LeadNT.aspx,第一次调用返回一个值,如果是1 ,则表示别人登陆这个帐号了,第二次调用,是用这个页面来注销当前用户:

 

LeadNT.aspx中的部分代码:

 

//第一次调用:

if (Request.QueryString["op"] == "otherLogin")

            {

                if (!string.IsNullOrEmpty(CUser.UserName))

                {

                    foreach (IList li in LoginInfo)

                    {
                        //此处是伪代码,如果自己写没这么复杂.一个实体类即可.

                        if (li[0].ToString() == ((UserInfo)Session["UserInfo"]).UserName && DateTime.Parse(li[1].ToString()) > DateTime.Parse(Session["LastLoginDate"].ToString())

                        {

                            LoginInfo.Remove(li);

                            Response.Write("1");

                            break;

                            return;

                        }

                    }

                }

            }

 

            //第二次调用

            if (Request.QueryString["op"] == "logout")

            {

 Response.Write("<script language='javascript' type='text/javascript'>alert('该帐号已在其他地方登录!');top.location.href=' "Logon.aspx?logout=true';</script>");

            }

 

这里调用logon.aspx是注销当前用户。

 

这样就实现了单用户登陆功能。当一个帐号同时登陆2次时,第一次会被刷下。

 

总结:

 

本文详细介绍了如何防止用一用户同时登陆。

此方案经我实验,100%可靠.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值