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

例外:

メッセージ「セッションはこのリクエスト中に明示的に破棄されました。再起動の試行は許可されていません。」という例外がキャッチされませんでした。library\Zend\Session.php:431 内

編集:
その理由は、2 番目の 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 セッションとは異なる動作をするため、Zend Framework ではなくバニラ PHP でこれが受け入れられる理由です。

犯人チェックはここにあります:

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 に答える