代码改变世界

一个简单的防止同一ID重复登陆的方法

2008-11-05 21:27  key_sky  阅读(1270)  评论(0编辑  收藏  举报

     主要思路是一个账号登陆就在缓存中注册一个ID,如果这个账号对应ID在缓存中存在,这不允许重复登陆。考虑到非正常退出等其他非正常问题。引用asp.net的ajax的timer控件结合session过期机制来插入和删除缓存ID

    第一步,用户登陆的时候,判断缓存ID是否存在,如果存在表示已经登陆,不允许再次登陆,如果不存在这登陆成功,并开始注册一个缓存ID。代码如下:

Code
string sKey = username.Text.Trim() + "_Login";
string sUser = Convert.ToString(Cache[sKey]);
if (sUser == null || sUser == string.Empty)
{
TimeSpan SessTimeOut
= new TimeSpan(0, 0, 0, 5, 0);
HttpContext.Current.Cache.Insert(sKey, sKey,
null, DateTime.MaxValue, SessTimeOut, System.Web.Caching.CacheItemPriority.NotRemovable, null);
[
"reload"] = false;
}
else
{
Response.Write(
"<script>alert('您的用户身份已经登陆!!!') </script>");
Session[
"reload"] = true;
return;
}

其中设置缓存ID存在的时候为5秒。超过5秒就失效。用户还在线,失效后怎么办,看第二步。

   第二步,进入Default页,首先判断Session["reload"]是否为true,如果值为true,则timer控件开始运行,this.Timer1.Enabled=true; timer能运行后,所写代码如下:

Code
protected void Timer1_Tick(object sender, EventArgs e)
{
try
{
if (Session["yonghuid"] != null)
{
//生成key
string sKey = Session["yonghuid"] + "_Login";
string sUser = Convert.ToString(Cache[sKey]);
TimeSpan SessTimeOut
= new TimeSpan(0, 0, 0, 5, 0);
if (sUser != null)
{
HttpContext.Current.Cache.Remove(sKey);
}
HttpContext.Current.Cache.Insert(sKey, sKey,
null, DateTime.MaxValue, SessTimeOut, System.Web.Caching.CacheItemPriority.NotRemovable, null);
}
else
{
this.Timer1.Enabled = false;
}
}
catch
{

}
}

其中,由于timer控件不停的异步刷新,如果非正常与服务器断开连接,则会弹出scriptmanager的错误提示,我们可以在前台的script中加入以下js

Code
<script type="text/javascript" language="javascript">
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
function EndRequestHandler(sender, args)
{
if (args.get_error() != undefined)
{
args.set_errorHandled(
true);
}
}
</script>

   这些都是我的个人见解,如果有什么错误请更正,不甚感激。