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

来源:http://www.cnblogs.com/roydux/archive/2008/07/15/simpleuserlogin.html

背景:

防止同一帐号多个用户同时登陆的问题.

该方案只考虑了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秒)取一下状态,看看这个用户名是不是在其他地方登陆了,这里用到了prototype的ajax:
<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%可靠.

我本也是抛块砖,让大伙扔块玉出来,评论里大部分还是质疑或否定这个,没关系,只是一个方案,需要的人可以拿来用.

发这个文章不是和大家比专业程度高低的,我自认为在博客园里,人人皆高手,篇篇皆精华.发这篇水文,实在有些班门弄斧了,各位都是玩模块,玩封装,玩引用的专家级人物,但愿各位专业大侠不要被本文误导.

作者:roydux

本文首发 LeadNT(http://www.leadnt.org/) 与博客园(http://roydux.cnblogs.com/).
Tags:  web登陆 web登陆qq web登陆界面 web登陆msn

延伸阅读

最新评论

  1. 我靠晚了晚了还是晚了!!!WEB QQ 我的机会呀!!!!!5555555555555555

发表评论