通过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=‘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地址来判断。

时间: 2024-08-11 07:41:59

通过SessionID和用户名来保证同一个用户不能同时登录的相关文章

在linux中用useradd命令创建一个用户后不能登录的解决

在linux学习过程中我用useradd 用户名来创建一个用户后,不能登录,通过网上查询看到这种说法: 一.etc/profile 文件的的权限不足,因为我改过该文件的权限,所以我去试了还是没有用 最后是在学习到谋个地方老师说创建一个新用户后再如果没有指定目录则会在home目录下创建一个与用户名相同的目录, 我用上面的useradd 用户名 命令执行后home命令中没有对应的目录,最后是通过 -m选项完成的, 通过useradd -m 用户名 可以在home目录下找到相应的目录,最后在登录,竟然

[asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的

一.感慨 很久前看到一篇博客中有句话大致的意思是:“asp.net 程序性能低下的主要原因是开发人员技术参差不齐”,当时看到这句话不以为然,然而时间过的越久接触的.net 开发人员越多就越认同这句话:特别最近发现非常一个成熟的项目中有些问题非常非常影响性能,最终影响的是用户体验,借此给大家分享一下关于asp.net中一个小小的点,但对项目有很大的性能提升:以前觉得自己接触的项目少小,然后接触的项目越多,越大就会越发现,同样的问题依旧存在: 二.先从最简单的asp.net mvc例子说起 1.Co

Oracle同一个用户下启动多个数据库实例

[email protected] oradata]$ export ORACLE_SID=APPDB[[email protected] oradata]$ lsnrctl startLSNRCTL for Linux: Version 11.2.0.4.0 - Production on 22-MAY-2014 11:42:15Copyright (c) 1991, 2013, Oracle.  All rights reserved.TNS-01106: Listener using li

完成一个登陆页面。(用户名:F11;密码:123456)。要求用户输入用户 名和密码,验证是否等于正确值。如果等于告知登陆成功,程序结束;否则告 知用户名密码有误。用户三次输入不正确,告知登陆失败,程序结束 。

#include <stdio.h>#include <string.h> /*完成一个登陆页面.(用户名:F11:密码:123456).要求用户输入用户名和密码,验证是否等于正确值.如果等于告知登陆成功,程序结束:否则告知用户名密码有误.用户三次输入不正确,告知登陆失败,程序结束 .*/ void main(){ char username[20]; char password[20]; int i = 0; for(i = 0; i < 3; i++) { printf(

Linux 用命令把同一个用户加入多个组

在RHEL7.2系统下用usermod 命令可把某用户添加进多个附加组,默认情况下,一次性添加多个附加组可用以下方式来添加: usermod -G 附加组1,附加组2,...,附加组N  用户名 [实例] [[email protected] ~]# useradd mk [[email protected] ~]# id mk uid=1159(mk) gid=1159(mk) 组=1159(mk) [[email protected] ~]# groupadd mk1 [[email pro

userdel 用户名 出现“用户**目前已登录”

userdel 用户名 出现“用户**目前已登录” 今天在删除用户账号的时候,发现一个奇怪现象,即: userdel: user newname is currently logged in 相关命令:userdel 将已有的用户abc删除: 1.切换到root用户 # su # 2.删除用户 # userdel abc # 该删除操作将用户删除但保留用户的home文件夹和邮件文件夹.并且当用户abc正在登录的时候,删除操作将失败,如下: # userdel abc userdel: user

JavaWeb-过滤器Filter学习(三)实现用户的自动登录与IP黑名单过滤

实现用户的自动登录: 解决方案: 设置一个全站拦截的过虑器. 在此过虑器中,读取用户带过来的Cookie信息,然后从中读取用户的用户名和密码,自动帮助用户登录. 即可实现自动登录功能. 用Filter验证用户是否已经登录过.已经登录过了,我们就根据他选择的自动登录来选择让他在多久内能自动登录. IP黑名单过滤就很简单了,只要在Filter过滤器防范一下就OK. 在init方法中,我们先把黑名单的IP加载进Set<String> set集合, Set集合有如下特点: Java.util.Hash

Ansible-Tower快速入门-4.以超级用户帐号登录【翻译】

以超级用户帐号登录 首先,登录tower需要使用tower服务器所在的URL,格式如下:https://<tower server name>/ 注意:tower安装了一个自签名证书用于HTTPS通信,你可能需要你的浏览器接受这个证书,如果你想要替换证书,可以查看“安装和设置”章节. 登录使用你安装tower过程中所设置的用户名和密码,默认情况下,用户名为”admin”,密码为”password”,你可以通过点击在用户标签上的admin帐户进行修改. 注意:关于普通用户,超级用户和组织管理员的

mysql新建用户本地无法登录

mysql新建用户本地无法登录 MySQLDebianGoogleAccess 出此是用mysql,因为root权限过高,所以新建一用户appadmin,权限仅为要用到的数据库.创建语句如下:grant select,insert,update,delete on test.* to [email protected]"%" identified by "password";其中@“%”是可以在任何地址登录. 创建后到mysql.user下查看,有该用户.但是使用m