Zend Framework - 会话ID重新生成,无法保持登录状态

时间:2011-05-11 11:04:26

标签: session zend-framework zend-session

敬畏人们:(没有人可以帮我解决这个问题

大家好,我正在尝试使用Zend Sessions将会话存储在数据库中,但是因为某些原因我的会话已经消失了。我不确定是否正在执行某些代码执行此操作或其他内容。

我注意到会话ID似乎在登录后的breif时间后重新生成。

即使在我的htaccess文件中添加了以下行,也是如此:

php_value session.auto_start 0

最终结果是我每登录一次都会注销。

在我的引导程序文件中显示我的代码

$config = array(
    'name'           => 'session',
    'primary'        => 'id',
    'modifiedColumn' => 'modified',
    'dataColumn'     => 'data',
    'lifetimeColumn' => 'lifetime'
);


$saveHandler = new Zend_Session_SaveHandler_DbTable($config);
Zend_Session::rememberMe($seconds = (60 * 60 * 24 * 30)); 

$saveHandler->setLifetime($seconds)->setOverrideLifetime(true); 

Zend_Session::setSaveHandler($saveHandler);
//start your session!
Zend_Session::start();

我没有使用任何其他与会话相关的功能,除了登录时Zend_Auth。


Infact rememberme调用Session类的regenerateID函数 - 最终结果是我每隔几分钟就会经常注销。

5 个答案:

答案 0 :(得分:5)

我认为您可能遇到此问题,因为您在开始会话之前调用了rememberMe。

你必须先启动会话,否则记住我不会做任何事情,因为它需要一个会话来设置rememberMe时间。

rememberMe调用regenerateId函数,Id的重新生成真正需要会话存在。

在会话开始后放置rememberMe调用,然后查看它是如何工作的。

如果不是,那么我不知道它是什么,因为我的代码与你的代码相似。

答案 1 :(得分:5)

你尝试过这样的事吗?

protected function _initSession() {
    $config = array(
        'name'  => 'session',
        'primary'  => 'id',
        'modifiedColumn' => 'modified',
        'dataColumn' => 'data',
        'lifetimeColumn' => 'lifetime',
        'lifetime' => 60*60*24*30,
    );

    Zend_Session::setSaveHandler(new F_Session_SaveHandler_DbTable($config));        
}

这种方式在初始化数据库会话后没有设置生命周期,但它直接包含在初始化选项中 - 它适用于我,我认为没有理由为什么在你的情况下会失败:)。

答案 2 :(得分:2)

我认为您需要在引导代码

之后查看以下值
session.gc_maxlifetime
session.cookie_lifetime

答案 3 :(得分:1)

我遇到了这个问题,因为我的数据库表中的主要ID设置为INT(11)(IDIOT!)

Duplicate DB sessions created upon Zend_Auth login

应该设置为CHAR(32)!我出于习惯将它设置为INT。我花了4天时间追踪这个。

答案 4 :(得分:0)

如果您在* .ini配置文件中配置会话资源,请检查 resources.session.cookie_domain 参数。 我记得这件事时花了3个小时。