zoukankan      html  css  js  c++  java
  • 通过SessionID和用户名来保证同一个用户不能同时登录(单点登录)

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

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

    代码
    
    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->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(this.txtName.Text))//如果当前用户已经登录,
                    {
                        //already login            
                        strKey = idE.Key.ToString();
                        hOnline[strKey] = "XX";//将当前用户已经在全局变量中的值设置为XX
                        break;
                    }
                }
            }
            else
            {
                hOnline = new Hashtable();
            }
    
            hOnline[Session.SessionID] = this.txtName.Text;//初始化当前用户的
            Application.Lock();
            Application["Online"] = hOnline;
            Application.UnLock();
            Response.Redirect("main.aspx");
    
        }

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

    代码
    
    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 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("<script>alert('你的帐号已在别处登陆,你被强迫下线!');top.location.href='Default.aspx';window.close();</script>");//退出当前到登录页面
                          // Response.Redirect("Default.aspx");
                           Response.End();
                         //  return false;
                      }
                     
                      //break;
                 }
                
            }
       }

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

    代码
    
    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->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地址来判断。

  • 相关阅读:
    Hello iOS
    钝化程序、逻辑冻结、冻结程序的延续、瞬间转移
    对字符串操作的各种笔试题
    .NET各大平台数据列表控件绑定原理及比较(WebForm、Winform、WPF)
    多线程计算----pthread
    Xcode的Hello World(简单易懂)
    two sets of Qt binaries into the same process的解决办法
    微软新一代输入法框架 TSF
    Starting the application on Mac does not work(拷贝platforms到不同的位置,才能解决问题),还可设置DYLD_PRINT_LIBRARIES=1 观察动态库
    dddd
  • 原文地址:https://www.cnblogs.com/BrokenIce/p/5900682.html
Copyright © 2011-2022 走看看