需求:同一帳號同一時間僅允許一處登入,後登入者踢掉先登入者 (類似 QQ)。利用 `Application` 全域變數儲存 `SessionID -> UserID` 對應,配合 `BasePage` 攔截已失效 Session。
protected void btnLogin_Click(object sender, EventArgs e)
{
// ... 驗證帳密成功 ...
string userId = "user123";
Hashtable online = (Hashtable)Application["Online"] ?? new Hashtable();
// 尋找舊 SessionID
string oldSessionId = null;
foreach (DictionaryEntry entry in online)
{
if (entry.Value?.ToString() == userId)
{
oldSessionId = entry.Key.ToString();
break;
}
}
// 標記舊 Session 為已踢出
if (oldSessionId != null)
online[oldSessionId] = "KICKED";
// 註冊新 Session
online[Session.SessionID] = userId;
Application.Lock();
Application["Online"] = online;
Application.UnLock();
Response.Redirect("Main.aspx");
}
public class BasePage : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
Hashtable online = (Hashtable)Application["Online"];
if (online != null && online.ContainsKey(Session.SessionID))
{
string status = online[Session.SessionID]?.ToString();
if (status == "KICKED")
{
online.Remove(Session.SessionID);
Application.Lock();
Application["Online"] = online;
Application.UnLock();
Response.Write("");
Response.End();
}
}
}
}
public partial class Main : BasePage { ... }