在哆麥詢盤管理系統的開發過程中,需要了這樣的問題:出于資訊安全的考慮,希望給每個能進入系統的人員一個賬戶,而不是所有人共用一個賬戶,并且一個賬戶同時隻能一人登陸。剛開始的做法是登陸加鎖,當使用者登陸之後,對此使用者進行标記,若此使用者未下線狀态下進行第二次登陸嘗試,則禁止其登陸。這樣做就解決了單賬戶多使用者同時登陸的問題,但是實際操作中,卻遇到了更大的問題:使用者登陸過程中對其進行了加鎖,則使用者離開時就必須要進行解鎖操作,而很多使用者離開網站的習慣是直接點選浏覽器的關閉按鈕,這就導緻無法解鎖,最終導緻使用者正常登陸也受到限制。
那麼如何友好的限制使用者賬戶登陸的呢?我們首先分析一下PHP是如何識别使用者是否登陸的。由于HTTP協定無狀态性的特點,我們無法通過它對使用者進行識别。一般來說,對使用者的識别主要通過cookie或session,它們之前最大的不同是cookie資料由用戶端存儲,每次向服務端發送請求時,用戶端把有效的cookie随請求發送到服務端,而session資料由服務端存儲,服務端可以根據用戶端發送的特定cookie值來判定這些請求是否屬于同一請求。我們這樣對使用者進行登陸檢測:
顯而易見,上面的代碼并不能保證單使用者隻能同時登陸一次。第一種單賬戶登陸限制的辦法是登陸時存儲本次回話的session id,當使用者登陸時,首先删除之前使用者的session id,再把本次登陸的session儲存起來,這樣一來,原來的使用者就會被新使用者擠下線:
在這個基礎上,我們可以對單使用者同時登陸的次數進行限制,隻需更改kick_user函數如下: function kick_user($num=1){ $last_login_session_id_file = file_get_contents("loginsession.txt"); //擷取上次登陸的session id $last_login_session_id_arr = explode("|",$last_login_session_id_file); if(!in_array(session_id(),$last_login_session_id_arr)){ array_push($last_login_session_id_arr,session_id()); } if(count($last_login_session_id_arr) > $num) { $rmsession = array_shift($last_login_session_id_arr); } if(isset($rmsession)){unlink(session_path."/sess_".$rmsession);} file_put_contents("loginsession.txt",implode("|",$last_login_session_id_arr));}
本文原創釋出php中文網,轉載請注明出處,感謝您的尊重!