单点登录

需求详情:

如果用户A用账号R00001登陆系统,那么用户B在另一台电脑上用账号R00001登陆系统后,A再点击页面时弹出“你的帐号已在别处登陆,你被强迫下线!”,跳转到登陆页面!

 

解析及方法:

1.   web服务器为每一个浏览器实例对应一个session。这个session有自己的一个独立id,。那么我们登陆系统的时候,把用户的sessionID和UserID以键值对的形式存在Application中。

2.   下一个用户登陆时,检查Application中是否存在UserID相同,sessionID不同的数据,如果存在,将这条数据UserID改为“XXXXXX”.

3.   pagebase文件中重写OnInit方法, 检查Application中当前sessionID对应的UserID是否为” XXXXXX”,如果是,则移除当前session,移除sessionID在Application中对应的数据,提示“你的帐号已在别处登陆,你被强迫下线!”,跳转到登陆页面。

4.   要注意的是,在Global.asax的Session_End方法中,将Application中对应当前SessionID的信息移除。

 

以下贴出部分代码:

   第一,登陆系统时,

   public void login(string UserID)

    {

        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] = "XXXXXX";

                    break;

                }

            }

        }

        else

        {

            hOnline = new Hashtable();

        }

 

        hOnline[Session.SessionID] = UserID;

        Application.Lock();

        Application["Online"] = hOnline;

        Application.UnLock();

    }

 

第二,PageBase中设置

      protected override void OnInit(EventArgs e)

    {

        Hashtable hOnline = (Hashtable)Application["Online"];

        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 && "XXXXXX".Equals(idE.Value.ToString()))

                    {

                        hOnline.Remove(Session.SessionID);

                        Application.Lock();

                        Application["Online"] = hOnline;

                        Application.UnLock();

                        //移除Session

                        //提示用户已被迫下线

                        //跳转到登陆界面

                    }

                    break;

                }

            }

        }

        base.OnInit(e);

    }

 

第三  Global

     void Session_End(object sender, EventArgs e)

    {

       Hashtable ht = (Hashtable)Application["Online "];

       if (ht[Session.SessionID] != null)

       {

           ht.Remove(Session.SessionID);

           Application.Lock();

           Application["Online"] = ht;

           Application.UnLock();

       }

 

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值