3

我的要求是,当用户代理更改会话应该销毁时,它应该启动新会话。但是如果在 start() 之前调用了destroy, Zend_Session::start() 就会抛出异常。


try { 
    Zend_Session::start();   
} catch (Zend_Session_Exception $e) {   
    Zend_Session::destroy(true);
    Zend_Session::start(); // breaking here   
    Zend_Session::regenerateId();   
}  

Zend_Session::registerValidator(new Zend_Session_Validator_HttpUserAgent());

例外:

未捕获的异常“Zend_Session_Exception”和消息“会话在此请求期间被显式销毁,不允许尝试重新启动。” 在库\Zend\Session.php:431

编辑:
原因是如果第二个 start() 命令已经在该请求中被调用,它会被静默忽略。我已经发布了一个问题,希望他们接受它..


if (self::$_sessionStarted) {
    return; // already started
}

请投票
http://framework.zend.com/issues/browse/ZF-11420

4

2 回答 2

2

伙计们,我已经自己解决了

try {
        Zend_Session::start();
    } catch (Zend_Session_Exception $e) {
        Zend_Session::destroy(true);

        $this->bootstrap('frontController');
        $front = $this->getResource('frontController');
        $front->setRequest(new Zend_Controller_Request_Http()); 
        $front->setResponse(new Zend_Controller_Response_Http());

        $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
        $redirector->gotoUrl($front->getRequest()->getRequestUri(),array('prependBase' => false));

    }
于 2011-07-01T15:51:25.093 回答
1

为什么要尝试重新启动会话?调用后只需将用户重定向到登录屏幕destroy()

编辑:

Zend_Session 与常规 php 会话的工作方式不同,因此这在 vanilla PHP 而不是 Zend Framework 中是可以接受的。

罪魁祸首检查在这里:

if (self::$_sessionStarted && self::$_destroyed) {
    require_once 'Zend/Session/Exception.php';
    throw new Zend_Session_Exception('The session was explicitly destroyed during this request, attempting to re-start is not allowed.');
}

您可以尝试在 Zend_Session 中注释掉这段代码并查看它的行为方式,尽管这样做很可能是出于特定原因。

于 2011-05-31T12:26:29.633 回答