后台管理员账号不能同时登陆,以及登陆使对方强制下线功能


功能的主要意思是不允许超级管理员同时登录,如果管理员登录时已经有其他管理员登陆了,则提示“您已通过其他浏览器登录,请退出后再登陆或者强制下线”,如果点击“强制下线”则进入后台管理中心,而以前登录的管理员下线。

强制下线的功能就是比如说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