可以通過SessionID和用戶名來保證同一個用戶不能同時登錄的問題,下面程序模仿了 QQ的登錄,當登錄後判斷當前帳號是否已經登錄,如果登錄。則踢掉以前登錄的用戶。
1.通過Application全局變量來存儲SessionID和用戶名,每次登錄時都保存,並且將 該Application存入 Hashtable中,當用戶登錄成功後,首先判斷該用戶是否已經存儲在 Application中,如果存在(說明已經登錄),則將該用戶對應的值設置為 XX(值為無用 ).
代碼
protected void loginbtn_Click(object sender, EventArgs e)
{
//登錄成功。。。。。。。
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] = "XX";//將當前用 戶已經在全局變量中的值設置為XX
break;
}
}
}
else
{
hOnline = new Hashtable();
}
hOnline[Session.SessionID] = UserID;//初始化當前用戶的
Application.Lock();
Application["Online"] = hOnline;
Application.UnLock();
Response.Redirect("main.aspx");
}
2,寫一個BasePage加一個Init方法如下,系統的所有頁面均繼承自該BasePage
代碼
protected override void OnInit(EventArgs e)
{
Hashtable hOnline = (Hashtable)Application["Online"];//獲 取已經存儲的application值
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 && "XX".Equals(idE.Value.ToString()))//說明在別處登錄
{
hOnline.Remove (Session.SessionID);
Application.Lock();
Application["Online"] = hOnline;
Application.UnLock();
Response.Write ("<script>alert('你的帳號已在別處登陸,你被強迫下 線!');top.location.href='Default.aspx';window.close();</script>");//退 出當前到登錄頁面
// Response.Redirect ("Default.aspx");
Response.End();
// return false;
}
//break;
}
}
}