2011-03-16 96 views
9

我想停止同一用戶的多次登錄。所以,我創建了一個表來跟蹤已登錄的用戶。登錄時,數據將被輸入到表中。當他們點擊註銷時,數據和會話將被刪除。如何避免同一用戶多次登錄

問題是,當他們關閉瀏覽器窗口而未註銷時,他們將無法再次登錄。

有沒有更好的方法來處理這個問題?

+0

您使用的是Microsoft SQL Server或MySQL嗎?我已經刪除了'MySQL'標籤,因爲我猜你正在使用'SQL Server'。隨意爲您的問題添加正確的標籤。 – Bobby 2011-03-16 09:37:39

+0

它的SQL服務器2005 – Kanishka 2011-03-16 10:15:41

回答

6

你有global.asax.cs文件

protected void Session_End(Object sender, EventArgs e) 
{ 
    //delete from database where userID = Session["userID"] 
} 
+0

Ty。我試過這樣做。只有在用戶點擊註銷時才能使用。 – Kanishka 2011-03-16 10:13:36

+0

@HaraHara,上面提到的解決方案是正確的,並且當服務器發生自動超時時它會被觸發。即,如果您將超時時間設置爲10分鐘。 Session_End會在SessionID – 2011-03-16 10:21:56

+0

執行的最後一次活動的10分鐘後觸發,我應該使用哪種會話模式?我正在使用SQL服務器的數據庫。我必須使用sql server模式還是InProc模式? – Kanishka 2011-03-16 10:31:23

1

Keap你會話超時短,出全自動當會話diposed日誌用戶

+0

這不會從數據庫中刪除數據。 – 2011-03-16 09:40:12

+0

你可以設置你自己的cutom代碼,當它發生並遠程從那裏用戶entriy在數據庫中 – kalvis 2011-03-16 09:46:33

0

刪除inforamtion表上的全球性事件Session_End只要保持一個會話變量說法true/false取決於登錄狀態。 True - 用戶已經登錄,False - 沒有登錄。

在很多情況下,我有一個用戶對象保存到會話中,所以我只是檢查它對null,它只是返回經過身份驗證的用戶或null(匿名) 。

夠簡單,沒有涉及數據庫。

編輯

如果下面的註釋理解問題正確,那麼請儘管這個答案。我指的是在不希望經過身份驗證的用戶在同一會話期間再次登錄的情況。

+0

我認爲你沒有正確理解這個問題。他不想檢查用戶是否登錄,他想確保用戶僅登錄一次。 – 2011-03-16 10:19:47

+0

一個會話變量不會通知客戶端的不同實例是否已登錄 – 2011-03-16 10:20:04

+0

我理解並更正了我的文章。 – Tengiz 2011-03-16 10:51:26

2

如果我們談論「的StateServer或SQLServer的」會話模式比:

Session_End事件將再次打電話Session.Abandon()火。在sql server上有工作ASPState_Job_DeleteExpiredSessions,如果用戶沒有使用註銷按鈕註銷,那麼過期的用戶會話。這個工作調用DeleteExpiredSessions存儲過程,所以我想你應該把一些邏輯(刪除記錄的用戶)到這個存儲過程。

documentation

您可以通過添加一個名爲 的Session_OnEnd到Global.asax文件子程序處理Session_OnEnd事件 。 當Abandon方法被呼叫時 或當會話有 過期時,Session_OnEnd子例程運行 。當 超時屬性指定的 分鐘數通過而沒有爲會話發出 請求時,會話過期。

的Session_OnEnd事件支持 只有當會話狀態模式 屬性設置爲InProc方式,這是 默認。如果會話狀態模式 是StateServer或SQLServer,則忽略Global.asax 文件中的 Session_OnEnd事件。如果會話狀態 模式設置爲自定義,則對於Session_OnEnd事件的支持 是由自定義會話狀態 商店提供商確定的 。

可以使用Session_OnEnd事件來 清理會話相關的信息 如因爲這是 由 的SessionID值的數據源追蹤用戶信息。

相關問題