0

我正在为预订巴士票编写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 分钟后没有会话清除。

有什么帮助吗?

谢谢

4

1 回答 1

0

很可能当您在没有用户登录的情况下存储会话数据时,您需要自己添加超时处理,幸运的是,它可以通过一些小模块轻松完成:

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');
}
于 2013-07-12T09:51:24.747 回答