我现在在几个ZF应用程序中遇到了这个问题,这非常令人沮丧:
在我的引导程序顶部附近,我有以下两行
Zend_Session::start();
Zend_Session::regenerateId();
我的应用程序需要使用Zend_Auth进行身份验证,并使用默认会话存储来保留身份。随机会话丢失,从而产生用户已注销的效果。如果我删除对Zend_Session :: regenerateId()的调用,则会话不会丢失。
重新生成会话ID可提高安全性,因此我希望能够正常运行。我的本地开发服务器(Windows)和我们的登台服务器(linux)
都会出现此问题答案 0 :(得分:5)
阅读完问题后,我一直在寻找解决问题的方法。实际上根据Zend Framework:文档解决方案很容易。
“如果用户已成功登录您的网站,请使用rememberMe()而不是regenerateId()。”
我希望这会帮助你。
问候,
尤尼斯
[编辑:这是我找到的地方的链接:Zend Framework: Documentation
答案 1 :(得分:4)
我和Zend_Session有一个相关的问题。由于以下问题,您的会话可能已丢失:
尝试使用:
Zend_Session::rememberMe(100); // any value here
然后使用会话数据集(例如用户登录)转到应用程序中的任何页面,并快速点击浏览器的刷新按钮(如双击)3-5次。你会看到你的会话数据已经消失了:(
我能解决这个问题的唯一方法是暂时不使用rememberMe()方法。我希望有人能在这里阐明这个问题。我认为regenerateId()方法会以某种方式混淆cookie值,以便从浏览器到服务器的后续调用不会与现有会话ID相关联。
答案 2 :(得分:0)
使用会话cookie时遇到同样的问题,当cookie到期时一切正常。
使用“记住我”功能时,过期日期设置为作为参数给出的秒数。
我的解决方案是在创建新的Zend_Application之后和调用$application->bootstrap()->run();
之前将会话重新生成代码放在index.php中,每5个请求重新生成一次id。
/** Zend_Application */
require_once 'Zend/Application.php';
// Create application, bootstrap, and run
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
// set httponly option (when set in application.ini it dosent work)
Zend_Session::setOptions(array('cookie_httponly' => true));
//regenerate sessionid after 5 hits
$defaultNamespace = new Zend_Session_Namespace();
if ($defaultNamespace->initialized > 3) {
Zend_Session::regenerateId();
$defaultNamespace->initialized = 0;
} else {
$defaultNamespace->initialized++;
}
//run application
$application->bootstrap()->run();