php - TP3.2 用户登录的时效问题

查看:286
本文介绍了php - TP3.2 用户登录的时效问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

用tp3.2做后台管理,在做用户登录时遇到一个问题.
1.后台用户登录之后,一直有效,放了一中午,关掉浏览器,用户登录状态一直存在,只有点击注销时才能实现用户的过期.
不是php的session有效期默认是1440秒(24分钟),如果客户端超过24分钟没有刷新,当前session会被回收,失效吗,为啥一直都有效了?

2.用tp怎么实现用户登录的时效性问题:用户不操作的时候,固定时间后自动时效.怎么实现了.
我的登录部分的代码:

        if(IS_POST){
            $uname=I('post.uname');
            $password=md5(I('post.password'));
            $res=M('manager')->where("uname='{$uname}'")->find();
            if(is_null($res)) {
                $this->error("用户名不存在");
                return false;
            }
            if($res['uname']==$uname&&$res['password']==$password){
                $_SESSION['uname']=$res['uname'];
                $_SESSION['expire']=time()+600;
                $this->success('登录成功',U('Rbac/Index/index'));
                exit();
            }
            $this->error("登录失败");
        }

我百度看的思路是利用$_Session['expire']来实现,但是我不知道这段代码放在什么位置合适,放在登录检查时不合适吧,该放在什么位置了?

        //        设置用户登录session登录限制时间
        if(isset($_SESSION['expire'])){
            if($_SESSION['expire']<time()){
                unset($_SESSION['expire']);
                $this->error('登录过期,请重新登录','Rbac/Login/login');
            }else{
//                刷新时间戳
                $_SESSION['expire']=time()+600;
            }
        }

解决方案

  1. 第一个问题:过了1440秒(24分钟)session为什么没有失效。

    在默认以文件方式存储session的前提下可以从以下两个方面探讨这个问题:
    一、session失效是在session文件最近一次修改到现在的时间距离大于php.ini中设置的session.gc_maxlifetime,它的默认值也就是你知道的1440秒(24分钟),在满足这个条件的情况下php会以gc_probability/gc_divisor的概率对session进行回收,其中gc_probability默认值为1,gc_divisor默认值是100(注意环境不同默认值也不同),那么就会有1%的概率对session进行回收,通俗的理解就是每100次php请求(其中调用了session_start()),只有1次机会对session进行回收
    二、我试验将gc_divisor设置为1,那么对session的回收不就是100%了吗?但是还是没有回收,后来发现用session id去请求它对应的、过期的session数据仍然可以获取成功,而这次请求会触发php去回收其它过期的session数据。如果用另外的浏览器去请求同一个地址就会发现这个问题;
    总结起来,如果要用session过期来作为判断用户过期的方式,那么最好的方式就是楼上说的,也就是你百度的在session中存放一个过期时间字段。用php本身的过期机制并不可靠。

  2. 第二个问题:代码放在什么位置。
    后台的每次请求都要验证用户是否登录过期,因此可以写一个公共类,里面有个构造函数,用来判断用户是否登录失效,然后所有后台类(除了登录)都继承这个类就行了。

这篇关于php - TP3.2 用户登录的时效问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆