我正在为公交车票预订编写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分钟后没有会话清除。
任何帮助?
谢谢
答案 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');
}