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

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

强制下线的功能就是比如说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》;
                 }
 }
}
原文地址:https://www.cnblogs.com/jiaosq/p/5622188.html