本例完成的功能就是防止用戶重復(fù)登錄!若用戶已經(jīng) 登錄,則當(dāng)其再次登錄時(shí),彈出提示框后返回!
實(shí)現(xiàn)思路:用戶登錄成功后,將用戶登錄信息存放到 Hashtable類型的Application["Online"]里面,其鍵 值為SessionID,其Value值為用戶ID;當(dāng)用戶注銷時(shí) ,調(diào)用Session.Abandon;在Global.asax里面的 SessionEnd事件中,將用戶ID從Hashtable中刪除;在 用戶訪問(wèn)頁(yè)面時(shí),察看Hashtable中是否有對(duì)應(yīng)的用戶 ID如果沒(méi)有則判斷用戶不在線(用戶不在線的原因可 能是按了注銷按鈕、網(wǎng)頁(yè)超時(shí)等)
?
//
1、公用類中判斷用戶是否在線的函數(shù)(供用戶調(diào)用)?
///
?
<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
;?
????
//
繼續(xù)判斷是否該用戶已經(jīng)登陸?
????
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已經(jīng)在線了!您不能重復(fù)登錄!
"
);?
????????
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(
"
用戶名錯(cuò)誤!
"
);?
????????
break
;?
????????
case
?
-
2
:?
????????????JScript.Alert(
"
密碼錯(cuò)誤!
"
);?
????????
break
;?
????????
default
:?
????????????sbPmt.Append(
"
登錄過(guò)程中發(fā)生未知錯(cuò)誤!
"
);?
????????????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、在每一個(gè)頁(yè)面需要刷新的地方,調(diào)用如下代碼:?
try
?
{?
????
if
(
!
common.MyUtility.AmIOnline(Session[
"
UserID
"
].ToString(),(Hashtable)Application[
"
OnLine
"
]))?
????
{?
????????
//
用戶沒(méi)有在線?,轉(zhuǎn)到登錄界面?
????????Response.Write(
"
<script>parent.document.location.href='Login.aspx';</script>
"
);?
///
/有框架時(shí)用?
????????
//
Response.Redirect("login.aspx");?
////
無(wú)框架時(shí)用?
????????
return
;?
????}
?
}
?
catch
?
{?
????
//
會(huì)話過(guò)期?,轉(zhuǎn)到登錄界面?
????Response.Write(
"
<script>parent.document.location.href='Login.aspx';</script>
"
);?
///
/有框架時(shí)所用?
????
//
Response.Redirect("login.aspx");?
////
無(wú)框架時(shí)用?
????
return
;?
}
?
?
深入思考:
由本例的解決方法可以加以延伸,比如,在存儲(chǔ)
UserID的時(shí)候,將UserID+客戶端IP地址一起存進(jìn)去,
則在將相應(yīng)信息取出來(lái)分析的時(shí)候,可以做到:當(dāng)用
戶在不同的計(jì)算機(jī)上先后登錄的時(shí)候,則允許最近一
次的登錄,而將之前的登錄刪除!等等等等
--這個(gè)里面是具體的詳細(xì)信息
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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