更改会话ID并在PHP Zend中保留数据

时间:2014-05-26 18:48:25

标签: php session zend-framework session-variables

我希望在用户使用我自己的前缀登录到自定义随机会话ID后更改会话ID。

但是,当我执行以下操作时会话数据丢失;

Zend_Session:setId('my-new-id');
Zend_Session:start();

但如果我执行以下操作,会话数据仍然可用;

Zend_Session:regenerateId();
Zend_Session:start();

Anyidea如何解决此问题?

1 个答案:

答案 0 :(得分:0)

library/Zend/Session.php:316

if ( !self::$_sessionStarted ) {
    self::$_regenerateIdState = -1;
} else {
    if (!self::$_unitTestEnabled) {
        session_regenerate_id(true);
    }
    self::$_regenerateIdState = 1;
}
  

最佳做法是在会话开始后调用此方法。如果在会话开始之前调用,则会在开始时重新生成会话ID。

另见:Global Session Management与ZF1:

$defaultNamespace = new Zend_Session_Namespace();
if (!isset($defaultNamespace->initialized)) {
    Zend_Session::regenerateId();
    $defaultNamespace->initialized = true;
}

<强>加入:

然后试试这个:

$commit = Zend_Session::namespaceGet('Default');
Zend_Session::writeClose(false);
// ^ session_commit(); // see Advanced Usage: http://framework.zend.com/manual/1.12/en/zend.session.advanced_usage.html#zend.session.advanced_usage.starting_a_session

.. change id with session_id("my-new-id");

// start new session ... 
$namespace = new Zend_Session_Namespace('Default');
foreach($commit as $idx => $data){
    $namespace->$idx = $data;
}

然而!在调用Zend_Session :: writeClose()之后,我们无法使用Zend_Session :: start()版本的22744dd重启会话

看到这个问题:

无论如何,我建议您观看开始会话的文档 - Starting a Session

和/或使用Zend_Session :: regenerateId();而不是Zend_Session :: setId()