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 w开发者_StackOverflow中文版as 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-11420Guys 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));
}
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.
精彩评论