關於同一使用者不能同時在兩臺電腦上登入問題的解決方案

iSQlServer發表於2009-10-23

今天接著做昨天的事情,有幾個技術上的問題都順利解決了。原來,一切都並不是想象中的那麼複雜。有些事情,即使沒有百分百的把握,也得冒險一搏。

這次的單子有兩個重點:

一、當某一使用者在一天之內連續3次錯誤登入以後,限制30分鐘內不可再次登入系統;

二、同一使用者不能同時在兩臺電腦上訪問系統,有點類似於QQ的登入驗證機制。

具體的程式碼就不說了,我只是想記錄一下思路,算是一個複習吧。

針對第一個問題,我是在網上查了一下資料以後才找到解決辦法的。由於在同一天內錯誤登入了三次之後,無論是清空瀏覽器快取,清空sessioncookie,或者更換瀏覽器,甚至更換電腦都無法進行登入。那就說明,錯誤的記錄資訊是儲存在伺服器端的。下面我按照分步驟的方式來做說明。

一、在系統中建立一個錯誤登入日誌表,包含以下五個欄位:ID,使用者名稱,(最後)登入時間,(最後)登入IP,登入錯誤次數,下一次允許登入的時間。

二、使用者登入時,首先進行一項準備工作:刪除當天以前的所有錯誤登入記錄(delete from tb_failLog where datediff(day,loginTime,getdate())>0 )。這樣做的目的是為了清除表中的資料冗餘。然後檢查錯誤登入使用者表中是否存在該使用者的錯誤登入記錄,如果不存在,則繼續進行密碼驗證等邏輯判斷;如果存在,那麼檢查該使用者當天的錯誤登入次數是否已經超過了系統限制的次數,然後再進行邏輯判斷:

1)如果已經等於或大於了系統限制,那麼接著驗證系統的當前時間是否大於了允許該會員下次登入的時間。如果當前時間小於允許該使用者登入的時間,就直接提示該使用者:您今天的登入次數已經超過了系統限制,請於系統允許的登入時間後再試。反之,則轉入密碼驗證等邏輯判斷。

2)如果該使用者的錯誤登入次數小於系統限制,那麼也接著進行密碼驗證等邏輯判斷。

三、使用者登入錯誤以後,查詢該表中是否具有該使用者的登入錯誤記錄,進行如下邏輯判斷:

1、如果沒有該使用者的錯誤登入記錄,那麼寫入一條新記錄,該條記錄中的“下一次允許登入的時間”應該是當前時間+30分鐘。

2、如果有該使用者的錯誤登入記錄,那麼將該使用者的錯誤登入次數加1,同時修改最後登入時間,最後登入IP,以及設定系統下次允許的登入時間為當前時間+30分鐘。

四、使用者登入成功以後,刪除該使用者的所有錯誤登入記錄。

這個解決辦法不會給系統資料庫造成太大的負擔,因為資料都是即時刪除掉的,最多也只會儲存當天的記錄。

針對第二個問題,其實我是在查了CSDN論壇上的一篇帖子之後才解決的。樓主問的問題其實和我所面對的問題完全一樣。解決辦法分以下五個步驟:

一、在系統中建立一個線上使用者表,當使用者登入系統以後,將該使用者的使用者名稱,登入時間(也叫最後活躍時間,將在後續步驟中用到),登入IP寫入表中。

二、使用者登入時,先檢查該使用者是否已經線上,若已經線上,則提示其賬號已經在別處登入。

三、使用者開啟頁面時,更新使用者的最後活躍時間(也有人稱之為“心跳時間”,我覺得這個比喻很貼切),同時,進行一些額外的檢查(將在第五步中提到)。

四、使用者正常退出系統時,刪除線上使用者表中的該條記錄,請注意,這裡說的是“正常退出”,即使用者必須點選點選了系統中的“退出”連結。然後順利的退出系統。

五、考慮到使用者非正常退出的情況,比如瀏覽器崩潰,甚至電源突然斷掉,中途斷網等不可預測因素。可能會導致某一使用者當前已經不線上了,但線上會員表中還是存在該會員的記錄。這就需要檢查使用者的最後活躍時間。於是在第三步的操作中同時增加一個操作:刪除最後活躍時間與當前時間相差大於10分鐘的線上使用者記錄(delete from tb_userOnLine where datediff(minute,lastTime,getdate())>10)。

由於資料都是即時刪除的,所以,系統的線上使用者表不會存在太多的記錄,及時有1000人同時線上,資料庫的壓力也不會有多大。

好了,到此為止,問題已經全部解決了。網上也有說用application來儲存資訊的,可我個人覺得,這樣對伺服器的壓力太大了。

    或許這個設計思路還有漏洞,歡迎各位指出,在此先行謝過!另外,如果還有更先進的設計方法,也請說出來大家一起學習學習,再次感謝!

原文地址:http://www.cnblogs.com/miaoxiao/archive/2009/10/23/1588572.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-617274/,如需轉載,請註明出處,否則將追究法律責任。

相關文章