zoukankan      html  css  js  c++  java
  • Asp.net中实现同一用户名不能同时登陆(单点登陆)

     
    2007年03月20日 星期二 上午 11:28
    Web 项目中经常遇到的问题就是同一用户名多次登陆的问题,相应的解决办法也很多,总结起来不外乎这几种解决办法:将登陆后的用户名放到数据库表中;登陆后的用户名放到Session中;登陆后的用户名放到Application中;登陆后的用户名放到Cache中。一般的这几种方法都是登陆了之后,如果没有正常退出,第二次登陆将不被允许。这样一般都会存在一个问题:如果用户没有正常退出系统,那么他接下来继续登陆的时候,因为Session没有过期等问题,会被拒绝继续登陆系统,只能等待Session过期后才能登陆。本文介绍的方法是采用类似于MSN登陆的方法,第二次登陆时会把第一次的登陆注销掉,第一次登陆将会类似于MSN弹出:您的帐号已在别处被登陆,您被强迫下线的提示信息。

    功能实现起来也比较简单:

    登陆用户名密码验证通过之后输入以下代码:

    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();

    用户登陆的时候将登陆用户名放在一个全局变量Online,Online为Hashtable结构,Key为SessionID,Value为用户名。每次用户登陆时均判断以下要登陆的用户名在Online中是不是已经存在,如果存在该用户名已经被登陆,将第一个人登陆的SessionID对应的用户名强制变更为XXXXXX,表示该登陆将被强制注销。

    建立一个CommonPage页,系统中所有的页面都继承于CommonPage页,在CommonPage页的后台代码中添加如下代码:

    override protected 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();
    MessageBox("你的帐号已在别处登陆,你被强迫下线!",Login.aspx);
    return false;
    }
    break;
    }
    }
    }

    }

    继承于CommonPage的页面在刷新时都要执行重载的OnInit中的代码,取出Online,找到该用户对应的SessionID,判断SessionID里对应的用户名是否变更,如果变更,就强迫下线,清掉Session,转到Login画面。

    最后需要在Session过期或者退出系统时释放资源,在Global.asax文件中的Session_End中添加如下代码:

    Hashtable hOnline = (Hashtable)Application["Online"];
    if(hOnline[Session.SessionID] != null)
    {
    hOnline.Remove(Session.SessionID);
    Application.Lock();
    Application["Online"] = hOnline;
    Application.UnLock();
    }

    如果用户不正常退出后重登陆,因为重登陆的优先级大,不会影响用户的登陆,而不正常退出的用户占用的资源会在Session过期后自动清除,不会影响系统的性能。
  • 相关阅读:
    自定义组件要加@click方法
    绑定样式
    647. Palindromic Substrings
    215. Kth Largest Element in an Array
    448. Find All Numbers Disappeared in an Array
    287. Find the Duplicate Number
    283. Move Zeroes
    234. Palindrome Linked List
    202. Happy Number
    217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/winner/p/828029.html
Copyright © 2011-2022 走看看