有时候你的网站账号被盗或者你在别处登录操作后台,会在右下角弹出提示信息提醒你的账号登录从不同的地方进入,否则你将被迫下线。对于这类对安全性要求比较高的网站,很多后台管理器都会做这种功能提醒。检查您的帐户是否被盗或是否有其他人登录并在后台操作是非常不安全的。为了防止两个人同时登录同时操作,可以强制一个账号下线。今天我们就来讲解一下这个知识点。当然不能用IP来判断,因为IP会随时在某个网段发生变化,但是有一种机制,就是session,恰好可以解决这个问题,只要你用同一个浏览器去访问网站,浏览器不会关闭每个访问者的session_id是常量,这正是解决这个问题所需要的。以TP5.0框架搭建的网站后台为例;使用哪个框架都是一样的(1)修改数据库用户表在用户表中,增加一个字段`session_id`varchar(32)用于存放登录后的session_id。(2)用户登录用户登录是正常判断账号密码和验证码。当这些都验证通过后,就把当前的session_id取出来,存放到数据库的user表中。(3)解决后台操作远程登录问题。为了方便验证和操作安全,基本上是先创建一个公共控制器Common来继承控制器基类,然后后台其他操作控制器继承这个公共控制器。在后台每一步之前,对用户状态的检测都放在Common控制器的__construct构造方法中。现在在__construct构造方法中,除了验证用户登录状态是否被锁定等,还需要取出本地的session_id,与admin表中存储的session_id进行比较。这时可以强制注销,返回登录页面。代码如下:$user=Db::name('admin')->where('id',session('admin_id'))->find();$session_id=session_id();if($user['session_id']!=$session_id){session_destroy();$this->error('登录异常,强制下线','登录/索引');}效果如下:login.php核心代码,isGet会显示登录页面,不执行登录处理操作。类登录扩展通用{public$is_check_login=false;publicfunctionindex(){if($this->request->isGet()){return$this->fetch();}//调用自定义方法实现登录$model=model('Admin');$result=$model->login();如果($result===false){$this->error($model->getError());}}}Admin.php,主要处理上述登录的逻辑和处理方法。检查等,如果不返回false,会存入session_idCommon.php公共控制器文件,login继承public方法,即中间件。意思是登录前优先使用public方式,这里收到的session_id是否和存储表中的session_id一致,如果不一致,会提醒你换个地方登录,强制退出!public$is_check_login=true;public$request;publicfunction__contruct(Request$req){parent::__contruct();$this->request=$req;if(!session('admin_id')&&$this->is_check_login){$this->error("先登录",'登录/索引');}if(session('admin_id')&&$this->is_check_login){$user="select...."//找到表中存储的session_id,然后比较if(session('admin_id')!=$user['session_id']){session_destroy();$this->error("登录异常,强制下线");}}}整个过程的思路实现起来非常简单!其实说的是sesson_id的一个用法!