本例完成的功能就是防止用戶重復登錄!若用戶已經 登錄,則當其再次登錄時,彈出提示框后返回!
實現思路:用戶登錄成功后,將用戶登錄信息存放到 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地址一起存進去,
則在將相應信息取出來分析的時候,可以做到:當用
戶在不同的計算機上先后登錄的時候,則允許最近一
次的登錄,而將之前的登錄刪除!等等等等
--這個里面是具體的詳細信息
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
