本例完成的功能就是防止使用者重複登入!若使用者已經
登入,則當其再次登入時,彈出提示框後返回!
實現思路:使用者登入成功後,將使用者登入資訊存放到
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地址一起存進去,
則在將相應資訊取出來分析的時候,可以做到:當用
戶在不同的電腦上先後登入的時候,則允許最近一
次的登入,而將之前的登入刪除!等等等等