ThinkPHP下设置30分钟无操作就退出登录(后端计时)

最初发表于: 2019-10-10 16:54:09

Step1 建立一个基类, 如/application/index/controller/IndexBase.php, 示例代码如下

<?php

namespace app\index\controller;

use think\Controller;


class IndexBase extends Controller
{

    // 初始化方法
    protected function _initialize()
    {
        $loginTime = 60 * 30; //设定登录持续时间为30分钟

        if (session('user')) {
            //已登录状态下, 检测session中存储的上次操作时间;
            $lastAction = session('user')['last-action'];

            //计算当前时间与上次操作的时间差last, 其单位是秒
            $last = time() - $lastAction;
            // echo $last;

            if ($last > $loginTime) {
                // 超时就清除session, 然后跳转至登录页
                session('user', null);
                $this->redirect(url('index/userx/login'));
            } else {
                //如果没有超时, 就刷新最后操作时间
                session('user')['last-action'] = time();
            }
        }
    }
}

Step2 在要验证登录时间的页面, 如首页; 首页的控制器/appilication/index/controller/Index.php, 它就不在继承Controller父类, 而是继承IndexBase这个基类, 示例代码如下

<?php

namespace app\index\controller;

use app\index\controller\IndexBase;

class Index extends IndexBase
{
    //页面: 全站首页
    public function index()
    {
       return $this->fetch();
    }
}

这个意思是说, 对所有如此操作的控制器, 它其中的每一个方法, 在运行前, 都要先运行IndexBase中的_initialize()方法

Step3 在登录时, 也记录last-action的时间, 所以登录方法中的Session操作是这样的

session('user', $res);
session('user')['last-action'] = time();//记录登录时间

这样, 在所有进行了像Step2那样操作的控制器, 就实现了检测时间, 是否退出.