首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 單一帳號防重複登入:Application + SessionID + Hashtable 實作踢人機制

     編輯:關於ASP.NET

需求:同一帳號同一時間僅允許一處登入,後登入者踢掉先登入者 (類似 QQ)。利用 `Application` 全域變數儲存 `SessionID -> UserID` 對應,配合 `BasePage` 攔截已失效 Session。

登入頁邏輯 (Login.aspx.cs)

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");
}

BasePage 攔截踢出事件


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();
            }
        }
    }
}

所有頁面繼承 BasePage

public partial class Main : BasePage { ... }

關鍵細節與優化

  • `Application.Lock/UnLock` 確保多執行緒安全。
  • `Hashtable` 操作為 O(1),百萬併發下建議改用 `ConcurrentDictionary` 或 Redis 分散式鎖。
  • Session 過期時需清理 `Application["Online"]`,可在 `Global.asax Session_End` 處理。
  • 生產環境建議採用 Redis 分散式 Session + Token 黑名單 替代 InProc Application,支援多伺服器叢集。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved