snowfox373 2007-11-26 09:51
Asp.net中防止用户多次登录的方法
在web开发时,有的系统要求同一个用户在同一时间只能登录一次,也就是如果一个用户已经登录了,在退出之前如果再次登录的话需要报错。 (n4OW8K H2H
常见的处理方法是,在用户登录时,判断此用户是否已经在Application中存在,如果存在就报错,不存在的话就加到Application中(Application是所有Session共有的,整个web应用程序唯一的一个对象):[code]string strUserId = txtUser.Text; X/h4cl1Yc2_b
ArrayList list = Application.Get("GLOBAL_USER_LIST") as ArrayList;
`!{l7Z
jm6c)s
if (list == null)
]!TjU ~
{ 1Q,}s+PG
b(TFV
list = new ArrayList(); 5u%w X|5JD%?
}
d6g {#[3} y
for (int i = 0; i < list.Count; i++) "[$wo't7X R7D
{
N+Mo'f#N A.L
if (strUserId == (list[i] as string))
_dH
f'kKJI
~*m(TK/y
{ 3yS?F5F2B
//已经登录了,提示错误信息
6_1lEaI7av
lblError.Text = "此用户已经登录"; m9M9z.xk!G'A(e@
return; @A+f#LF:f;bj:ra?
}
x!{ pq(cA|1Lt
}
(TAYC+}bq$?
list.Add(strUserId); .b2]x @ z$o}
t?
Application.Add("GLOBAL_USER_LIST", list);[/code] 当然这里使用Cache等保存也可以。 9~(UOyN"j3V}
fbH
cJm&b:y;q
!BK#v-E*V:k;Yk
H b.sgzw$|
接下来就是要在用户退出的时候将此用户从Application中去除,我们可以在Global.asax的Session_End事件中处理:[code]void Session_End(object sender, EventArgs e) %p'lh`5L"y7rH
{
v B6?O1UrO
// 在会话结束时运行的代码。
k?-t)]GVI
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 HS^7F%hi
D
// InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer #N:Xx.QO4_m
// 或 SQLServer,则不会引发该事件。 :S2\2u1l1b/W
string strUserId = Session["SESSION_USER"] as string;
:G8a3Y1}}f0h
ArrayList list = Application.Get("GLOBAL_USER_LIST") as ArrayList; 4lS%t$^\8v3NI
if (strUserId != null && list != null) T[7iK6r4b f@X2j
;]PMQ$a D
q0S*b*Co
B5vKh"]
{ l$I.ayU X4u
list.Remove(strUserId);
6f+k$won'{G vxb
Application.Add("GLOBAL_USER_LIST", list);