需求详情:
如果用户A用账号R00001登陆系统,那么用户B在另一台电脑上用账号R00001登陆系统后,A再点击页面时弹出“你的帐号已在别处登陆,你被强迫下线!”,跳转到登陆页面!
解析及方法:
1. web服务器为每一个浏览器实例对应一个session。这个session有自己的一个独立id,。那么我们登陆系统的时候,把用户的sessionID和UserID以键值对的形式存在Application中。
2. 下一个用户登陆时,检查Application中是否存在UserID相同,sessionID不同的数据,如果存在,将这条数据UserID改为“XXXXXX”.
3. pagebase文件中重写OnInit方法, 检查Application中当前sessionID对应的UserID是否为” XXXXXX”,如果是,则移除当前session,移除sessionID在Application中对应的数据,提示“你的帐号已在别处登陆,你被强迫下线!”,跳转到登陆页面。
4. 要注意的是,在Global.asax的Session_End方法中,将Application中对应当前SessionID的信息移除。
以下贴出部分代码:
第一,登陆系统时,
public void login(string UserID)
{
Hashtable hOnline = (Hashtable)Application["Online"];
if (hOnline != null)
{
IDictionaryEnumerator idE = hOnline.GetEnumerator();
string strKey = "";
while (idE.MoveNext())
{
if (idE.Value != null && idE.Value.ToString().Equals(UserID))
{
//already login
strKey = idE.Key.ToString();
hOnline[strKey] = "XXXXXX";
break;
}
}
}
else
{
hOnline = new Hashtable();
}
hOnline[Session.SessionID] = UserID;
Application.Lock();
Application["Online"] = hOnline;
Application.UnLock();
}
第二,PageBase中设置
protected override void OnInit(EventArgs e)
{
Hashtable hOnline = (Hashtable)Application["Online"];
if (hOnline != null)
{
IDictionaryEnumerator idE = hOnline.GetEnumerator();
while (idE.MoveNext())
{
if (idE.Key != null && idE.Key.ToString().Equals(Session.SessionID))
{
//already login
if (idE.Value != null && "XXXXXX".Equals(idE.Value.ToString()))
{
hOnline.Remove(Session.SessionID);
Application.Lock();
Application["Online"] = hOnline;
Application.UnLock();
//移除Session
//提示用户已被迫下线
//跳转到登陆界面
}
break;
}
}
}
base.OnInit(e);
}
第三 Global
void Session_End(object sender, EventArgs e)
{
Hashtable ht = (Hashtable)Application["Online "];
if (ht[Session.SessionID] != null)
{
ht.Remove(Session.SessionID);
Application.Lock();
Application["Online"] = ht;
Application.UnLock();
}
}