我希望在用户使用我自己的前缀登录到自定义随机会话ID后更改会话ID。
但是,当我执行以下操作时会话数据丢失;
Zend_Session:setId('my-new-id');
Zend_Session:start();
但如果我执行以下操作,会话数据仍然可用;
Zend_Session:regenerateId();
Zend_Session:start();
Anyidea如何解决此问题?
答案 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()