關於同一使用者不能同時在兩臺電腦上登入問題的解決方案
今天接著做昨天的事情,有幾個技術上的問題都順利解決了。原來,一切都並不是想象中的那麼複雜。有些事情,即使沒有百分百的把握,也得冒險一搏。
這次的單子有兩個重點:
一、當某一使用者在一天之內連續3次錯誤登入以後,限制30分鐘內不可再次登入系統;
二、同一使用者不能同時在兩臺電腦上訪問系統,有點類似於QQ的登入驗證機制。
具體的程式碼就不說了,我只是想記錄一下思路,算是一個複習吧。
針對第一個問題,我是在網上查了一下資料以後才找到解決辦法的。由於在同一天內錯誤登入了三次之後,無論是清空瀏覽器快取,清空session和cookie,或者更換瀏覽器,甚至更換電腦都無法進行登入。那就說明,錯誤的記錄資訊是儲存在伺服器端的。下面我按照分步驟的方式來做說明。
一、在系統中建立一個錯誤登入日誌表,包含以下五個欄位: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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- root和其他使用者不能登入的解決方案
- mysql 本機不能登入問題解決MySql
- 微信登入-6問題解決方案
- 同一臺電腦配置兩個git賬號Git
- 關於QQ郵箱登入提示一鍵登入解決方案
- 在兩臺電腦安裝Simphony
- 在Linux上安裝Oracle時DISPLAY問題解決方案LinuxOracle
- 關於回覆資料後,登入不上的問題
- 在同一臺電腦上使用多個 SSH KEYS (GITHUB OR GITLAB)GithubGitlab
- 關於xmanager不能遠端登入Solaris 10主機問題
- Ubuntu上關於PyCharm不能用matplotlib畫圖的解決方案UbuntuPyCharm
- 解決關於IIS gzip不能正常啟用的問題
- linux pptpd賬號同時登入的問題Linuxpptp
- 關於xml編碼問題在VB,PHP,JAVA下的解決方案XMLPHPJava
- Java Web防止使用者重複(同一使用者同時)登入實現方式JavaWeb
- 關於azkaban上傳job壓縮包報錯問題的解決方案
- Jeff Dean的激盪人生:我和Sanjay在同一臺電腦上寫程式碼
- 同時訪問內外網解決方案
- 關於OneThink中後臺一個頁面中兩個編輯器導致內容不能同時實現更新的問題的解決
- SSH登入很慢問題的解決
- 奇怪的登入問題及解決
- 解決ssh登入慢的問題
- 關於CCSprite不能及時顯示的問題
- 谷歌基情實錄:和Jeff Dean在同一臺電腦上寫程式碼谷歌
- vsftpd不能登入問題FTP
- 在一臺電腦上執行兩個或多個tomcatTomcat
- 圖片和文字同時上傳解析問題(關鍵在於資料在body體裡面)
- 解決內、外網同時訪問問題
- 關於儲存過程中不能操作其他使用者表資料的問題解決儲存過程
- 關於無法用 https 登入 SAP ABAP Netweaver 系統的問題和解決方案HTTP
- 關於XP中“登入失敗:未授予使用者在此計算機上的請求登入型別”的解決計算機型別
- 在weblogic 8上釋出war包,關於不能上傳的問題Web
- HA叢集中的腦裂問題解決方案
- 解決VNC有些鍵不能輸入的問題VNC
- oracle程式異常中止時登入掛起問題的解決Oracle
- 關於 flask_session 在登入時設定後,再其他介面獲取時為None的問題FlaskSessionNone
- JDK1.2關於JDBC中文問題的解決方案 (轉)JDKJDBC
- 解決ppt裡面新增flash後在其他電腦上不能播放的問題