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