zoukankan      html  css  js  c++  java
  • 后台管理员账号不能同时登陆,以及登陆使对方强制下线功能

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

    强制下线的功能就是比如说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》;
    
                     }
    
     }
    
    }
    
  • 相关阅读:
    [Js-JDBC]事务
    [Js-JDBC]SQL注入及解决,Statement与PreparedStatement
    [Js-Java SE]IO+Properties配置文件
    [Js-Java SE]可变长参数
    [Js-Java SE]线程同步(加锁)(synchronized,守护进程,死锁,计时器)
    [Js-MySQL]函数
    [Js-MySQL]运算符优先级
    2015年3月30日
    Maven知识点一览
    记一次MySQL(5.7版本)数据库的主从同步和备份
  • 原文地址:https://www.cnblogs.com/jiaosq/p/5622188.html
Copyright © 2011-2022 走看看