Zend_Session doesn't allow you to destory and recreate a session

雨燕双飞 提交于 2019-12-10 18:12:27

问题


My requirement is, When user agent change session should destroy, and it should start new session. But Zend_Session::start() is throwing an exception if destroy was called before 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());

Exception:

Uncaught exception 'Zend_Session_Exception' with message 'The session was explicitly destroyed during this request, attempting to re-start is not allowed.' in library\Zend\Session.php:431

EDIT:
The reason is the second start() command is silently ignored if it was already called in that request. I have posted an issue, Hope they accept it..


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

Please vote it
http://framework.zend.com/issues/browse/ZF-11420


回答1:


Guys I have solved it my self

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

    }



回答2:


Why are you trying to restart the session? Just redirect the user to the login screen after calling destroy()

EDIT:

Zend_Session works differently from regular php sessions and hence why this is acceptable in vanilla PHP and not Zend Framework.

The culprit check is here:

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.');
}

You could try commenting out this chunk of code in Zend_Session and seeing how it behaves, although its highly likely this has been done for a specific reason.



来源:https://stackoverflow.com/questions/6187439/zend-session-doesnt-allow-you-to-destory-and-recreate-a-session

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!