防止用户重复登录! - 军军小站|张军博客

防止用户重复登录!

系统 2217 0

本例完成的功能就是防止用户重复登录!若用户已经 登录,则当其再次登录时,弹出提示框后返回!

实现思路:用户登录成功后,将用户登录信息存放到 Hashtable类型的Application["Online"]里面,其键 值为SessionID,其Value值为用户ID;当用户注销时 ,调用Session.Abandon;在Global.asax里面的 SessionEnd事件中,将用户ID从Hashtable中删除;在 用户访问页面时,察看Hashtable中是否有对应的用户 ID如果没有则判断用户不在线(用户不在线的原因可 能是按了注销按钮、网页超时等)

 

// 1、公用类中判断用户是否在线的函数(供用户调用) 
/**/ ///   <summary>  
///  判断用户strUserID是否包含在Hashtable h中 
///   </summary>  
///   <param name="strUserID"></param>  
///   <param name="h"></param>  
///   <returns></returns>  

public   static   bool  AmIOnline( string  strUserID,Hashtable h) 

    
if (strUserID  ==   null
    
return   false

    
// 继续判断是否该用户已经登陆 
     if (h  ==   null
    
return   false

    
// 判断哈希表中是否有该用户 
    IDictionaryEnumerator e1  =  h.GetEnumerator(); 
    
bool  flag  =   false
    
while (e1.MoveNext()) 
    

        
if (e1.Value.ToString().CompareTo(strUserID)  ==   0
        

            flag 
=   true
            
break
        }
 
    }
 
    
return  flag; 
}
 

// 2、用户登录事件处理: 
private   void  btnlogin_Click( object  sender, System.Web.UI.ImageClickEventArgs e) 
/**/ /// /User为自定义的类,其中包含Login方法 
    User CurUser  =   new  User(); 
    CurUser.UserID 
=   this .username.Text.Trim(); 

    
if (MyUtility.AmIOnline(CurUser.UserID, (Hashtable)Application[ " Online " ])) 
    

        JScript.Alert(
" 您所使用的登录ID已经在线了!您不能重复登录! " ); 
        
return
    }
 

    CurUser.LoginPsw 
=  FormsAuthentication.HashPasswordForStoringInConfigFile( this .password.Text.Trim(), " SHA1 " ); 
    
int  ii  =  CurUser.Login(); 
    StringBuilder sbPmt 
=   new  StringBuilder(); 

    
switch (ii) 
    

        
case   0 // 如果登录成功,则将UserID加入Application["Online"]中 
            Hashtable h  =  (Hashtable)Application[ " Online " ]; 
            
if (h  ==   null
            h 
=   new  Hashtable(); 
            h[Session.SessionID] 
=  CurUser.UserID; 
            Application[
" Online " =  h; 

            Session[
" UserID " =  CurUser.UserID; 
            Session[
" UserNM " =  CurUser.UserNM; 
            Session[
" RoleMap " =  CurUser.RoleMap; 
            Session[
" LoginPsw " =  CurUser.LoginPsw; 
            Session[
" LoginTime " =  DateTime.Now; 
            Response.Redirect(
" ChooseRole.aspx " ); 
        
break
        
case   - 1
            JScript.Alert(
" 用户名错误! " ); 
        
break
        
case   - 2
            JScript.Alert(
" 密码错误! " ); 
        
break
        
default
            sbPmt.Append(
" 登录过程中发生未知错误! " ); 
            JScript.Alert(sbPmt.ToString()); 
        
break
    }
 
    
return
}
 

// 3、在Global.asax中的Session_End事件: 
protected   void  Session_End(Object sender, EventArgs e) 

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

    
if (h[Session.SessionID] != null
    h.Remove(Session.SessionID); 

    Application[
" Online " ] = h; 
}
 

// 4、在每一个页面需要刷新的地方,调用如下代码: 
try  

    
if ( ! common.MyUtility.AmIOnline(Session[ " UserID " ].ToString(),(Hashtable)Application[ " OnLine " ])) 
    

        
// 用户没有在线 ,转到登录界面 
        Response.Write( " <script>parent.document.location.href='Login.aspx';</script> " );  /**/ /// /有框架时用 
         // Response.Redirect("login.aspx");  //// 无框架时用 
         return
    }
 
}
 
catch  

    
// 会话过期 ,转到登录界面 
    Response.Write( " <script>parent.document.location.href='Login.aspx';</script> " );  /**/ /// /有框架时所用 
     // Response.Redirect("login.aspx");  //// 无框架时用 
     return
}
 

 

深入思考:
由本例的解决方法可以加以延伸,比如,在存储
UserID的时候,将UserID+客户端IP地址一起存进去, 则在将相应信息取出来分析的时候,可以做到:当用 户在不同的计算机上先后登录的时候,则允许最近一 次的登录,而将之前的登录删除!等等等等


--这个里面是具体的详细信息

http://www.cnblogs.com/panshuiqing/articles/951779.html

防止用户重复登录!


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论