如何检测同一账号的重复登录

来源:互联网 发布:顺科洗衣软件 编辑:程序博客网 时间:2024/04/27 22:49

      以前做过的系统中似乎一直忽略了这个问题,今天上csdn的时候看到有人提了这么个问题,恍然大悟。想到金融、影院、远程教学、甚至QQ(用的是单点登录机制,后一个登录的会强迫前一登录的下线)都有类似的功能,这对他们来说是起码的要求,否则N多个人只买一个帐号然后同时登录,那不亏死了。

     这问题我的第一反应就是在数据库中填加一个Flag字段,登录的时候修改为“1”退出的时候重新设置为“0”
大家想一下,这样会不会有问题呢?增加数据库服务器的压力不说,要是用户是非正常退出怎么办?比如断电、死机等不可预知的事件。那么数据库中Flag字段将会一直是“1”, 也就是说这个帐号从此作废。当然你可以在程序部分做一些规定,避免类似的事件,但总体感觉这样不是很好。

  还有个想法是:在Global文件中的Application_Start()方法中设置:
思路是这样:当用户登陆时,先判断online中是否将登陆的用户名记录,如果记录了则判断此用户是否超时.没有超时则提示信息,用户已经登陆.超时则清除online中当条的记录.并记录它.然后用记每跟服务交互一次,则更新Rule中的时间 代码如下:

Hashtable online=new Hashtable();
this.Context.Cache.Insert("online",online);

online中储存的是已登陆的用户,online的Key为SessionID,值将包含另一个对象
Rule中,下面是Rule代码

class Rule
{
  private string _userName;
  private DateTime dtTimeOut;

  public UserName
  {
     set{}get{}
  }
  ......
}

还有个方法是利用cache机智:

string key = TextBox1.Text; //用户名文本框设为cache关键字 
string uer = Convert.ToString(Cache[key]); //读取cache中用户相应的值
//判断cache中是否有用户的信息,如果没有相关的值,说明用户未登陆
if (uer == null uer == String.Empty)
{
 //定义cache过期时间 

 TimeSpan SessTimeout = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0); 

 //第一次登陆的时候插入一个用户相关的cache值,
 HttpContext.Current.Cache.Insert(key, key, null, DateTime.MaxValue, SessTimeout, System.Web.Caching.CacheItemPriority.NotRemovable, null);
 Session["ADMINID"] = TextBox1.Text;
 Response.Redirect("main.ASPx");
}
else
{
 //重复登陆
 Response.Write(" <script >alert( '您的账号已经登陆! ');window.location= 'login.aspx '; </script >");
}