第十五章:第4节论坛系统(BBS)同一管理员账号不能在两个浏览器同时处于登陆状态

更新于:2018-02-04 15:04:53

在做这个功能前,我们要先做一件事,修改session的存储方式,把session使用memcache存入内存中。


在看下面的内容前,大家要先确保开发环境中已安装了memcache,Windows怎么安装,百度一下就知道了。


1)更改session存储方式为memcache


1.png


218行:填写“memcache”,这样完成了session存储方式的切换,这是因为TP框架已为我们写好了代码。


1.png


TP框架已提供了三种驱动方式(三个类),我们使用Memcache.php,楠神前面《第十一章:第18节》写的一个memcache类就是借鉴这个类写的。


特别说明:


1.png


有个地方楠神需要说下:


看这个Session.php文件的78、79行代码,当我们设置了session时间为1小时,不仅session的时间是1小时,存储session_id的cookie也是1小时。那这样会出什么问题呢?


在session的有效期内,就算管理员把浏览器关闭了,打开浏览器依然会处于登录状态。


把79行代码注释掉,在session的有效期内把浏览器关掉,就会变成退出状态。


大家应该能明白什么原因。关闭浏览器后,cookie存储的session_id值改变了,所以就请求不到上次的session数据了。但其实上次的session数据值,如果还处在session有效期内,这些数据依然在memcache中,并没有被删除。


总之,根据自己的业务需要去选择到底要不要注释掉。安全点,应该需要注释掉,因为很多人没有点“退出”的习惯,都只是把浏览器一关就当退出了。


另外,大家如果想测试下是否和楠神说的一样,一定要分别用不同的浏览器做测试。


2)实现原理


把session的存储方式转成memcache以后,接下来就好操作了。


通过查看下面的代码


1.png


可知道,每个用户的session数据都是以session_id作为键值存入memcache的。“$this->config['session_name']”默认是空字符串。


楠神设计的登录日志表已把每次的session_id都记录了,那功能就可以这样写:


在每次登录成功时,获取到当前用户上一次登录的session_id,如果与本次登录的session_id不一样,就把上一次的session数据(不管有没有)从memcache中删掉。上一次的session数据没有了,这样就实现了本次登录把上次登录状态强制退出。


3)实现代码


因为要对memcache做操作,有可能后面还会对memcache做其他增删查改的操作,为了让代码更规范,我们需要写一个memcache扩展类。


1.png


类中定义了deletePrevAdminSession方法


1.png


然后在Login控制器中调用


1.png


这样代码就完成了。


楠神本地测试过了,完全可以实现“同一管理员账号不能在两个浏览器同时处于登陆状态”功能。


本节学习代码》》》