2012-04-12 33 views
2

我有一個字段爲'loginStatus'的表。現在,每次用戶登錄時,該值都設置爲1,並且在單擊註銷後將該值設置爲0.現在,當用戶嘗試登錄時,將檢查該字段的值,如果該值爲0,則用戶可以登錄,如果是1,則用戶無法登錄。現在,如果無論如何瀏覽器已關閉,用戶將無法使用該用戶ID登錄。因爲該字段的值仍然是1(他沒有點擊註銷按鈕,所以它沒有改變)。除非用戶關閉瀏覽器,否則我的應用程序運行良好。瀏覽器關閉時的單用戶多登錄預防

我知道這個問題可以以不同的方式解決,但我被要求這樣做。現在的問題是我沒有那麼多的Java EE的親,所以多個幫助解釋正是我正在尋找。

另外我有一個可能的解決方案,就像:創建一個數據庫觸發器,將loginStatus值更改爲0,這將在用戶登錄後15分鐘後觸發。現在我也不知道如何創建會在特定時間後觸發的觸發器。

回答

1

您可以創建定期運行並使舊會話過期的數據庫作業。根據您使用的Oracle版本,您可以使用DBMS_JOB包或更復雜的DBMS_SCHEDULER包。 DBMS_JOB是一個較舊的包,但對於這樣相對簡單和孤立的任務,學習曲線較少。舉例來說,如果你有一個存儲過程UNLOCK_ACCOUNTS,當執行時,確定哪些帳戶解鎖和解鎖它們,你可以使用DBMS_JOB有該程序運行,每15分鐘

DECLARE 
    l_jobno INTEGER; 
BEGIN 
    dbms_job.submit(l_jobno, 
        'BEGIN unlock_accounts; END;', 
        sysdate + interval '15' minute, 
        'sysdate + interval ''15'' minute'); 
    commit; 
END; 

當然,你也可以使用一個Java調度器(Quartz是一個流行的)或DBMS_SCHEDULER包來做同樣的事情。但是,這確實需要存在某個存儲登錄時間戳的字段,以便UNLOCK_ACCOUNTS過程可以計算出超過15分鐘前發生的登錄。

然而,一般來說,這整個架構是相當可疑的。很奇怪的是,您希望有一個基於Web的應用程序(本質上是無狀態的)拒絕登錄,因爲用戶在較早的時間點打開了另一個瀏覽器。如果一段時間作爲安全事項暫時停用,超時會比較常見,但15分鐘對於這類事情通常太短 - 即使銀行網站通常會讓您閒置的時間比這更長。而且這種方法甚至不會阻止您同時從多個瀏覽器/計算機登錄,只要登錄發生的時間相距超過15分鐘即可。

2

如果您已經強制要求您滿足此要求,則無需運行任何工作即可自動過期。

而不是一個簡單的「開/關」標誌,在設置爲當前日期/時間的表上有一個日期/時間戳。每當用戶用請求點擊服務器時,您都會將此列更新爲當前時間。

如果第二個會話嘗試登錄,該會話應該檢查表上的日期/時間戳,如果它超過15分鐘前,則允許登錄;否則會被阻止。

相關問題