【问题标题】:Zend_Session doesn't allow you to destory and recreate a sessionZend_Session 不允许你破坏和重新创建会话
【发布时间】:2011-05-31 12:16:31
【问题描述】:

我的要求是,当用户代理更改会话应该销毁时,它应该启动新会话。但是如果在 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

【问题讨论】:

    标签: php zend-framework zend-session


    【解决方案1】:

    各位,我自己解决了

    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】:

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

      编辑:

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

      罪魁祸首在这里:

      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 中注释掉这段代码并查看它的行为方式,尽管这样做很可能是出于特定原因。

      【讨论】:

      • 我在引导程序中有一个全局会话管理,它验证请求并启动会话。到那时,请求将不会被发送。那为什么还要提出另一个要求呢?正如我们已经知道那个会话是错误的那样?我们可以很容易地开始新的,对吧?
      • 如果您销毁会话并重新创建它,服务器将存储与浏览器会话 cookie 不同的会话哈希,因此无法正常工作
      • 只有当我发现用户代理对特定浏览器的会话 cookie 有错误时,我才会销毁会话。在这种情况下,我可以假设它是一种会话黑客,可以破坏会话,启动新会话,将新的哈希发送到浏览器......所以它就像新用户一样......
      • 是的,我之前已经检查过了。我在问题跟踪器中发布了一个问题。
      猜你喜欢
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 2013-11-10
      • 2012-07-19
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多