我需要在点击我网站上的特定页面时设置一个非常短的会话(3分钟)。如果有人在该3分钟会话期间再次点击该页面,则会话应该更新为从该时间起3分钟后到期。
在我的“bootstrap”上(它不是典型的Zend引导程序,但它包含在每个页面中),我执行以下操作:
$aSessionSaveHandlerConfig = array
(
"name" => "Sessions",
"primary" => "Session_ID",
"modifiedColumn" => "UpdateTimestamp",
"dataColumn" => "Data",
"lifetimeColumn" => "Lifetime",
);
$oSaveHandler = new Zend_Session_SaveHandler_DbTable($aSessionSaveHandlerConfig);
$oSaveHandler->setLifetime(App::$ReservationTimeout)->setOverrideLifetime(true);
Zend_Session::setSaveHandler($oSaveHandler);
ini_set("session.cookie_lifetime",App::$ReservationTimeout);
$aSessionOptions = array
(
"gc_probability" => 100,
"gc_divisor" => 100,
"gc_maxlifetime" => App::$ReservationTimeout,
"cookie_lifetime" => App::$ReservationTimeout,
);
Zend_Session::setOptions($aSessionOptions);
然后在应该创建/更新会话的页面中,我有:
App::$ReservationSession = new Zend_Session_Namespace("ReservationSession");
$oSaveHandler = Zend_Session::getSaveHandler();
$oSaveHandler->setLifetime(App::$ReservationTimeout);
我在数据库中看到记录,生命周列是正确的,但如果我反复点击创建/更新会话的页面,我会在3分钟后获得一个新的会话ID(另一个在垃圾后被删除)集合。
看来问题是让cookie更新它的时间。有什么想法吗?
答案 0 :(得分:3)
要使会话cookie更新其到期时间,您可以使用Zend_Session::rememberMe()更改cookie的默认生存期。调用rememberMe()
也会导致Zend_Session::regenerateId()
被调用,从而生成新的会话ID,将旧会话数据复制到新会话,并向浏览器发送新的会话cookie。
尝试以下代码,看看它是否解决了您的问题:
App::$ReservationSession = new Zend_Session_Namespace("ReservationSession");
$oSaveHandler = Zend_Session::getSaveHandler();
$oSaveHandler->setLifetime(App::$ReservationTimeout);
// Call remember me which will send a new session cookie with 3 minute expiration
// from the current time. Old session data is copied to the new one and the old
// session is deleted
Zend_Session::rememberMe(App::$ReservationTimeout);
有关详细信息,请参阅Session Identifiers上的手册部分,或另请参阅How to reset a Zend rememberMe function on each automatic login?
<强>更新强> 鉴于您的评论,我提出了您可以使用的解决方案。
这样做是像往常一样启动会话,然后检查会话中的值以查看用户是否有现有会话。
如果他们确实有会话,则使用setcookie()使用现有参数(包括会话ID)发送更新的会话cookie,但它将到期时间设置为time() + $ReservationTimeout
。如果他们没有会话,则无需更新cookie,因为到期时间已经正确,并且会在下一次请求时更新(假设他们在到期之前访问)。
App::$ReservationSession = new Zend_Session_Namespace("ReservationSession");
$oSaveHandler = Zend_Session::getSaveHandler();
$oSaveHandler->setLifetime(App::$ReservationTimeout);
if (!isset(App::$ReservationSession->hasSession)) {
// user had no session before or it was expired
App::$ReservationSession->hasSession = true;
} else {
// user has a valid session, update the cookie to expire 3 mins from now
$params = session_get_cookie_params();
$expire = time() + App::$ReservationTimeout;
setcookie(session_name(),
Zend_Session::getId(),
$expire,
$params['path'],
$params['domain'],
$params['secure'],
$params['httponly']);
}
我使用文件会话处理程序测试了解决方案,它按预期工作,我认为它也应该适用于您的情况。