本例完成的功能就是防止用戶重復登錄!若用戶已經
登錄,則當其再次登錄時,彈出提示框后返回!
實現思路:用戶登錄成功后,將用戶登錄信息存放到
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.hashpasswordforstoringincon
figfile(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地址一起存進去,
則在將相應信息取出來分析的時候,可以做到:當用
戶在不同的計算機上先后登錄的時候,則允許最近一
次的登錄,而將之前的登錄刪除!等等等等
新聞熱點
疑難解答
圖片精選