【问题标题】:Change Session ID And Keep Data in PHP Zend在 PHP Zend 中更改会话 ID 并保留数据
【发布时间】:2014-05-26 18:48:24
【问题描述】:

一旦用户使用我自己的前缀登录到自定义随机会话 ID,我想更改会话 ID。

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

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

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

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

知道如何解决这个问题吗?

【问题讨论】:

    标签: php session zend-framework session-variables


    【解决方案1】:

    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()

    【讨论】:

    • 仍然没有多大帮助,因为我想生成一个带有预定义前缀的会话 ID,例如 myprefix-************************
    • 细节还在丢失:(
    • 奇怪 -_- 使用最新的变体应该没问题,因为 Zend_Session:setId() 包装了 session_id($id);并且应该修复丢失数据的所有问题/使用 $commit 你应该从 Zend_Session_Namespace('Default') 复制所有数据...需要更多代码细节
    • 所以,当我去 Zend_Session::namespaceGet('Default');我没有得到任何数据,但 new Zend_Session_Namespace('Default');这行得通。但是,由于某种原因使用 2 thing 选项时,不会应用新的会话数据。
    • namespaceGet 仅检索您的会话命名空间的所有数据。 'Default' 是默认名称(参见文档)。在更改 id 之前在哪里以及如何分配会话数据?检查 - Tutorial Examples
    猜你喜欢
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多