后台管理員賬號不能同時登陸,以及登陸使對方強制下線功能


功能的主要意思是不允許超級管理員同時登錄,如果管理員登錄時已經有其他管理員登陸了,則提示“您已通過其他瀏覽器登錄,請退出后再登陸或者強制下線”,如果點擊“強制下線”則進入后台管理中心,而以前登錄的管理員下線。

強制下線的功能就是比如說QQ中你的賬號被知道你賬號的人擠下去了,你重新登錄,又被擠下去,。

下面總結一下我開始做個功能的實現思路,首先肯定是圍繞SESSION來進行,當A管理登錄時,接受到A的SESSION信息,當B管理使用同一賬號登錄時,消除A,而讓B進行操作,A給出提示並退出。

下面先為講解幾個函數,理解這幾個函數對實現這個功能很有幫助:

file_put_contents(file,data,mode,context):函數功能,把一個字符串寫入文件中  file:規定要寫入數據的文件,如果文件不存在,則創建一個新文件。data:規定要寫入文件的數據,mode,context:分別代表規定如何寫入文件,以及規定文件句柄環境,這倆個暫時不用,了解即可。

file_get_contents() :函數功能,把整個文件讀入一個字符串中,與file_put_contents還是有所區別的。

unset():是注銷定義的變量。 
session_id():存取目前 session 代號。本函數可取得或者重新配置目前存放 Session 的代號。若無參數 id 則表示只有取得目前 Session 的代號,加上參數則表示將 Session 代號設成新指定的 id。輸入及返回均為字符串。 
session_id()就是你在不同瀏覽器輸出都會生成不同的字符串,用以區分。 
下面展示部分代碼 
//首先是登錄提交到的方法 
public function index(){ 
        $user= M ("表"); 
 $adminname=$_POST['接收用戶名']; 
 $adminpwd=md5($_POST['接收密碼']); 
 $arr=$user->where("數據庫name='$adminname'")->find(); 
 $id=$arr['數據庫id']; 
 if($arr){ 
 if($arr['password']==$adminpwd){ 
//在數據庫中添加loginstatus字段,1為已登錄狀態,0為未登錄狀態 
///B管理登錄則loginstatus已經為1,進入↓ 
 if($arr['loginstatus']==1){ 
 echo 用戶已登錄!是否強制下線? 《a href='/XX/xx/xx?name=".$adminname."'> 是 《/a》 《a href='/XX/XX/xx'》 否 《/a》; 
 } 
 else{ 
//開啟session,設定各項值 
 session_start();  
 session("name",$adminname); 
 session("time",time()); 
 session('u_id',$arr['ma_id']); 
 $session_id=session_id(); 
 //存入文件,若無filename文件夾,系統自動生成 
 file_put_contents("filename",$session_id); 
 $datar['loginstatus']=1; 
 //使數據庫記錄當前狀態 
 $ls=$user->where("ma_id='$id'")->save($datar); 
 echo 《script》alert('登錄成功!');location.href='/admin.php/Index/index';《/script》; } }else{ echo 《script》alert('密碼錯誤');location.href='/admin.php/Admin/index';《/script》; } }else{ echo 《script》alert('用戶名錯誤');location.href='/admin.php/Admin/index';《/script》; 
 } 
 } 
//到此,“第一個管理員”已經成功登錄,並且數據庫狀態字段為1,session各項值都已生成 
//這時如果B管理登錄,則進入上面紫色流程,轉入B方法↓ 
 public function B(){ 
     $user= M ("表"); 
 $adminname=$_GET['通過地址欄傳過來的name']; 
 $arr=$user->where("數據庫name='$adminname'")->find(); 
 $id=$arr['數據庫id']; 
 $session_id=session_id(); 
 //存入文件 
 file_put_contents("filename",$session_id); 
//這時又新生成了filename,A管理登錄時生成的filename被替換 
 session("name",$adminname); 
 session("time",time()); 
 session('u_id',$arr['ma_id']); 
 //因為A登錄時數據庫中判定狀態的loginstatus已為1,所以不需要更新 
 echo "} 
 //此時B已登錄,並且替換的A登錄時生成的有關數據,使A操作時先執行的公共文件不允許執行,A進行的操作頁面無效,從而把A擠下去, 
 //公共文件部分 
 public function __construct() 
    { 
 parent::__Construct(); 
    if(empty($_SESSION['name'])) 
        { 
  echo 《script》alert('未登錄,請先登錄!');top.location.href='/admin.php/Admin/index';《/script》; 
    } 
 else{ 
 //取到系統此時的session_id 
 $session_id=file_get_contents("filename",$session_id); 
 //進行對比,如果判斷到B的session_id,則清除A的session_name,導致A不能進行操作 
 if(session_id()!=$session_id){ 
 unset($_SESSION['name']); 
 echo 《script》alert('異地登陸!');top.location.href='/admin.php/Admin/index';《/script》; 
 } 
     } 
} 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM