關於同一使用者不能同時在兩臺電腦上登入問題的解決方案
今天接著做昨天的事情,有幾個技術上的問題都順利解決了。原來,一切都並不是想象中的那麼複雜。有些事情,即使沒有百分百的把握,也得冒險一搏。
這次的單子有兩個重點:
一、當某一使用者在一天之內連續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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 129 會員同一賬號,限制只在同一臺電腦裝置上單點登入,新登入後原登入會自動退出
- 關於OneThink中後臺一個頁面中兩個編輯器導致內容不能同時實現更新的問題的解決
- 微信登入-6問題解決方案
- 關於onethink移植後登陸不了後臺問題的解決
- 關於QQ郵箱登入提示一鍵登入解決方案
- Ubuntu上關於PyCharm不能用matplotlib畫圖的解決方案UbuntuPyCharm
- 解決關於IIS gzip不能正常啟用的問題
- 關於回覆資料後,登入不上的問題
- 關於無法用 https 登入 SAP ABAP Netweaver 系統的問題和解決方案HTTP
- Java Web防止使用者重複(同一使用者同時)登入實現方式JavaWeb
- 關於azkaban上傳job壓縮包報錯問題的解決方案
- 同一臺電腦配置兩個git賬號Git
- SSH登入很慢問題的解決
- HA腦裂問題解決方案
- 同時訪問內外網解決方案
- Shell Limits設定問題導致使用者不能登入MIT
- 關於萬網上不能應用onethink問題
- oracle程式異常中止時登入掛起問題的解決Oracle
- 請教一個問題,我在本地測試後臺可以正常登入的,為什麼將原始碼打包覆蓋到另外一臺電腦上後登入後臺時沒有反應原始碼
- 基於CodeMirror開發線上編輯器時遇到的問題及解決方案
- 關於 flask_session 在登入時設定後,再其他介面獲取時為None的問題FlaskSessionNone
- GitHub 不能訪問解決方案Github
- 關於uniapp呼叫支付寶登入問題APP
- Ubuntu16.04使用者登入介面死迴圈問題的解決Ubuntu
- 關於 larabbs yarn 安裝加速不能用解決方案Yarn
- 關於Failed to resolve的問題解決AI
- 解決 PBootCMS 後臺登入不顯示驗證碼的問題boot
- 在膝上型電腦合蓋時不掛起 Ubuntu的解決方案Ubuntu
- 關於分散式事務帶來的問題及解決方案分散式
- 關於JS的浮點數計算精度問題解決方案JS
- PbootCMS後臺關閉驗證碼,登入提示驗證碼不能空的解決方法boot
- 在兩臺電腦安裝Simphony
- 解決ZBLOG PHP 程式無法登入後臺賬戶問題PHP
- 親測ubuntu18系統下解決MySQL5.7版本的root使用者密碼沒提示輸入問題不能登入問題UbuntuMySql密碼
- Jeff Dean的激盪人生:我和Sanjay在同一臺電腦上寫程式碼
- 關於修改程式碼後不能及時生效的問題
- 解決Hexo關於圖片的問題Hexo
- 關於解決問題的幾個段位
- 新能源汽車充電雲平臺方案:使用者找樁難的問題怎麼解決?