Zend_Session не позволяет вам уничтожать и воссоздавать сеанс - PullRequest
3 голосов
/ 31 мая 2011

Мое требование: когда сеанс смены пользовательского агента должен уничтожить, и он должен начать новый сеанс.Но Zend_Session :: start () генерирует исключение, если уничтожение было вызвано перед 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());

Исключение:

Uncaught исключение 'Zend_Session_Exception' с сообщением 'Сеанс был явно уничтожен во время этого запроса, попытка перезапуска не разрешена.'в библиотеке \ Zend \ Session.php: 431

РЕДАКТИРОВАТЬ:
Причина в том, что вторая команда start () молча игнорируется, если она уже была вызвана в этом запросе.Я опубликовал вопрос, надеюсь, они его примут ..


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

Пожалуйста, проголосуйте
http://framework.zend.com/issues/browse/ZF-11420

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

Ребята, я решил это сам

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

    }
1 голос
/ 31 мая 2011

Почему вы пытаетесь перезапустить сеанс? Просто перенаправьте пользователя на экран входа в систему после вызова destroy()

EDIT:

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 и посмотреть, как он себя ведет, хотя, скорее всего, это было сделано по определенной причине.

...