asp.net 单用户登录

可以通过SessionID和用户名来保证同一个用户不能同时登录的问题,下面程序模仿了QQ的登录,当登录后判断当前帐号是否已经登录,如果登录。则踢掉以前登录的用户。

 

1.通过Application全局变量来存储SessionID和用户名,每次登录时都保存,并且将该Application存入Hashtable中,当用户登录成功后,首先判断该用户是否已经存储在Application中,如果存在(说明已经登录),则将该用户对应的值设置为XX(值为无用),

 

protected void loginbtn_Click(object sender, EventArgs e)
     {
         //登录成功。。。。。。。
         Hashtable hOnline = (Hashtable)Application["Online"];// 读取全局变量
         if (hOnline != null)
         {
             IDictionaryEnumerator idE =  hOnline.GetEnumerator();
             string strKey = "";
             while (idE.MoveNext())
             {
                 if (idE.Value != null &&  idE.Value.ToString().Equals(UserID))//如果当前用户已经登录,
                 {
                     //already login
                     strKey = idE.Key.ToString();
                     hOnline[strKey] = "XX";//将当前用 户已经在全局变量中的值设置为XX
                     break;
                 }
             }
         }
         else
         {
             hOnline = new Hashtable();
         }
         hOnline[Session.SessionID] = UserID;//初始化当前用户的 
         Application.Lock();
         Application["Online"] = hOnline;
         Application.UnLock();
         Response.Redirect("main.aspx");
     }


2,写一个BasePage加一个Init方法如下,系统的所有页面均继承自该BasePage

 

 protected override  void OnInit(EventArgs e)
   {
       Hashtable hOnline = (Hashtable)Application["Online"];//获取已经存储的application值
       if(hOnline != null)
       {
        IDictionaryEnumerator idE = hOnline.GetEnumerator();
        while(idE.MoveNext())
        {
             if(idE.Key != null && idE.Key.ToString().Equals(Session.SessionID))
             {
              //already login
                 if (idE.Value != null && "XX".Equals(idE.Value.ToString()))//说明在别处登录
                  {
                       hOnline.Remove(Session.SessionID);
                       Application.Lock();
                       Application["Online"] = hOnline;
                       Application.UnLock();
                       Response.Write("<mce:script type="text/javascript"><!--
alert('你的帐号已在别处登陆,你被强迫下线!');top.location.href='Default.aspx';window.close();
// --></mce:script>");//退出当前到登录页面
                      // Response.Redirect("Default.aspx");
                       Response.End();
                     //  return false;
                  }
                 
                  //break;
             }
            
        }
   }

 

3.在程序退出后从Application中清除当前SessionID

 

void Session_End(object sender, EventArgs e) 
{
        // 在会话结束时运行的代码。 
        // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
        // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer 
        // 或 SQLServer,则不会引发该事件。
        Hashtable hOnline = (Hashtable)Application["Online"];
        if (hOnline[Session.SessionID] != null)
        {
            hOnline.Remove(Session.SessionID);//清除当前SessionID
            Application.Lock();
            Application["Online"] = hOnline;
            Application.UnLock();
        }
}



 

4.如果程序非正常退出,SessionID没有及时的清除,那么也不会影响帐号的正常登录,而SessionID也会随着Session的过期而自动清除,服务器也不会有压力。

5,如果感觉存储在Application中感觉不好,也可以将SessionID存入数据库中,判断方法和上面一样。

6,测试时注意在不同机器上面测试,同一台机子上面的SessionID是一样的,每次设置为XX后又有新值进去,看不到效果,如果要防止同一个帐号在同一台机子上面同事登录两次以上,可以通过mac地址来判断。

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值