在做这个功能前,我们要先做一件事,修改session的存储方式,把session使用memcache存入内存中。
在看下面的内容前,大家要先确保开发环境中已安装了memcache,Windows怎么安装,百度一下就知道了。
1)更改session存储方式为memcache
218行:填写“memcache”,这样完成了session存储方式的切换,这是因为TP框架已为我们写好了代码。
TP框架已提供了三种驱动方式(三个类),我们使用Memcache.php,楠神前面《第十一章:第18节》写的一个memcache类就是借鉴这个类写的。
特别说明:
有个地方楠神需要说下:
看这个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以后,接下来就好操作了。
通过查看下面的代码
可知道,每个用户的session数据都是以session_id作为键值存入memcache的。“$this->config['session_name']”默认是空字符串。
楠神设计的登录日志表已把每次的session_id都记录了,那功能就可以这样写:
在每次登录成功时,获取到当前用户上一次登录的session_id,如果与本次登录的session_id不一样,就把上一次的session数据(不管有没有)从memcache中删掉。上一次的session数据没有了,这样就实现了本次登录把上次登录状态强制退出。
3)实现代码
因为要对memcache做操作,有可能后面还会对memcache做其他增删查改的操作,为了让代码更规范,我们需要写一个memcache扩展类。
类中定义了deletePrevAdminSession方法
然后在Login控制器中调用
这样代码就完成了。
楠神本地测试过了,完全可以实现“同一管理员账号不能在两个浏览器同时处于登陆状态”功能。