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

ASP.NET 防止用戶重複登入的完整方案

     編輯:關於ASP.NET

需求:同一用戶同一時間僅允許一處登入。常見做法是用 Application 變數記錄已登入用戶 ID,登入時檢查,登出時移除。但瀏覽器直接關閉不會觸發 Session_End,導致殘留記錄。本文提供兩種補救方案。

基礎機制:Application 記錄登入用戶

// 登入時檢查
string userId = txtUser.Text;
ArrayList list = Application["GLOBAL_USER_LIST"] as ArrayList ?? new ArrayList();
if (list.Contains(userId)) { /* 提示已登入 */ return; }
list.Add(userId);
Application["GLOBAL_USER_LIST"] = list;

// Session_End 移除
void Session_End(object sender, EventArgs e)
{
    string userId = Session["SESSION_USER"] as string;
    ArrayList list = Application["GLOBAL_USER_LIST"] as ArrayList;
    if (userId != null && list != null)
    {
        list.Remove(userId);
        Application["GLOBAL_USER_LIST"] = list;
    }
}

注意:Session_End 僅在 sessionState mode="InProc" 時觸發。

方案一:JavaScript 攔截關閉事件

function window.onbeforeunload() {
    if (event.clientX > document.body.clientWidth && event.clientY < 0 || event.altKey) {
        window.open("logout.aspx");
    }
}
  • 在 logout.aspx 執行與 Session_End 相同的移除邏輯,並自動關閉視窗。
  • 缺點:瀏覽器相容性差,「檔案→關閉」無法攔截,JS 可能被禁用。

方案二:縮短 Session 超時 + 定時心跳(推薦)

  • 將 Session Timeout 設短(如 5 分鐘)。
  • 頁面定時 AJAX 請求保持 Session 活著。
  • 用戶關閉瀏覽器 → 心跳停止 → Session 自然過期 → Session_End 觸發清理。

此法不依賴客戶端腳本,相容性最好,是工業級常用做法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved