首页 > 代码库 > 通过SessionID和用户名来保证同一个用户不能同时登录
通过SessionID和用户名来保证同一个用户不能同时登录
转自http://blog.csdn.net/cctcc/article/details/9773185
可以通过SessionID和用户名来保证同一个用户不能同时登录的问题,下面程序模仿了QQ的登录,当登录后判断当前帐号是否已经登录,如果登录。则踢掉以前登录的用户。
1.通过Application全局变量来存储SessionID和用户名,每次登录时都保存,并且将该Application存入 Hashtable中,当用户登录成功后,首先判断该用户是否已经存储在Application中,如果存在(说明已经登录),则将该用户对应的值设置为 XX(值为无用).
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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=http://www.mamicode.com/‘Default.aspx‘;window.close(); script >");//退出当前到登录页面 // Response.Redirect("Default.aspx"); Response.End(); // return false; } //break; } } } |
3.在程序退出后从Application中清除当前SessionID
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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地址来判断。
通过SessionID和用户名来保证同一个用户不能同时登录
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。