Typo3会话超时设置

时间:2013-07-12 06:48:16

标签: session typo3

我正在为公交车票预订编写typo3 v6.1 extbase扩展程序。我正在使用控制器中的代码

将项目(不同日期的门票)存储到篮子中
protected function restoreFromSession() {
      $sessionData = $GLOBALS['TSFE']->fe_user->getKey('ses', 'basket');
      return unserialize($sessionData);
}

protected function writeToSession($object) {
    $sessionData = serialize($object);
    $GLOBALS['TSFE']->fe_user->setKey('ses', 'basket', $sessionData);
    $GLOBALS['TSFE']->fe_user->storeSessionData();
    return $this;
}

protected function cleanUpSession() {
   $GLOBALS['TSFE']->fe_user->setKey('ses', 'basket', NULL);
   $GLOBALS['TSFE']->fe_user->storeSessionData();
   return $this;
}

但是如果没有浏览器活动,我想在篮子里保留5分钟内的物品。 (没有用户在这里登录。) 因此,在会话超时后,如果用户继续进行结账,我需要显示错误消息。

所以我的问题是如何在用户不活动5分钟后清除会话。

我尝试在安装工具中设置这些值,但没有成功。

'FE' => array(
'lifetime' => '60',
'sessionDataLifetime' => '60',
),

但是在浏览器不活动1分钟后没有会话清除。

任何帮助?

谢谢

1 个答案:

答案 0 :(得分:0)

最有可能因为您在没有用户登录的情况下存储会话数据,您需要自己添加超时处理,幸运的是,使用一些小mod可以轻松完成:

protected function restoreFromSession() {
    $sessionData = unserialize($GLOBALS['TSFE']->fe_user->getKey('ses', 'basket'));

    // if current session is to old invalidate it and return null
    if (mktime() >= $this->getSessionTimeout()) {
        $this->cleanUpSession();
        return null;
    }
    // else set new timeout and return the data...
    $this->setSessionTimeout();
    return $sessionData;
}


protected function writeToSession($object) {
    $sessionData = serialize($object);
    $GLOBALS['TSFE']->fe_user->setKey('ses', 'basket', $sessionData);
    $GLOBALS['TSFE']->fe_user->storeSessionData();
    $this->setSessionTimeout();
    return $this;
}

protected function cleanUpSession() {
    $GLOBALS['TSFE']->fe_user->setKey('ses', 'basket', NULL);
    $GLOBALS['TSFE']->fe_user->setKey('ses', 'basketLifetime', NULL);
    $GLOBALS['TSFE']->fe_user->storeSessionData();
    return $this;
}

protected function setSessionTimeout() {
    $GLOBALS['TSFE']->fe_user->setKey('ses', 'basketLifetime', mktime() + 300);
    $GLOBALS['TSFE']->fe_user->storeSessionData();
    return $this;
}

protected function getSessionTimeout() {
    return $GLOBALS['TSFE']->fe_user->getKey('ses', 'basketLifetime');
}

因此,如果会话被清除,您可以创建一个简单的重定向到某个操作的示例:

if ($this->restoreFromSession() == null) {
    $this->redirect('start');
}