4

短い質問:

サーバー上でセッションの有効期限が更新されたときに、ブラウザーでセッション Cookie の有効期限が更新されないのはなぜですか?

長い質問:

数週間前にこれについて同様の質問を投稿しましたが、その時点ではすべての事実を把握していませんでした. 詳細がわかり、質問の性質が変わったので、新しい質問として投稿します。

まず、CakePHP 2 で、APP/Config/core.php をセッション用に次のように設定しました。

    Configure::write('Session', array(
        'defaults' => 'database',
        'cookie' => 'mycookie',
        'timeout' => 1 // 1 minute - just for testing
    ));

そのため、アプリでデータベースにセッションを作成するページをロードします。これまでのところすべて順調です。

1341288066セッションはに等しい期限切れになるようにスタンプされTue, 03 Jul 2012 04:01:06 GMTます。繰り返しますが、今から 1 分後なので、これは素晴らしいことです。まさに私が欲しかったもの。

Firefox の Cookie 画面を見ると、予想どおりの Cookie が見つかります。

    Name: mycookie
    Content: aqm0gkmjfsuqje019at8cgsrv3
    Host: localhost
    Path: /
    Send for: Any type of connection
    Expires: Tue 03 Jul 2012 11:01:06 AM ICT  // (04:01:06 GMT)

この 1 分間のウィンドウ内で、アプリに戻ってページを更新します。次に、セッションが更新されているかどうかを確認します。それは、私が期待したものと等しい1341288122セッションIDに対して表示されます。セッションの有効期限は、ページを最後にリロードしてから 1 分になるように更新されました。aqm0gkmjfsuqje019at8cgsrv3Tue, 03 Jul 2012 04:02:02 GMT

残念ながら、ブラウザの Cookie はまだExpires: Tue 03 Jul 2012 11:01:06 AM ICT(ie: 04:01:06 GMT) に設定されており、まさにそれが機能します。つまり、次に更新を押すと、古いセッション ID がまだ技術的に有効であるにもかかわらず、Cake はまったく新しいセッション ID を生成します。

私の質問は、基本的にここで何が起こっているのですか? ブラウザーで Cookie が新しい有効期限で更新されないのはなぜですか?

4

3 に答える 3

4

あなたが発見した問題は確かに予期せぬものであり、存続すべきセッションを終了させます。

これは、CakePHP が PHP のセッション関数を使用した結果です。CakePHP バグトラッカーにエントリ ( #3047 ) があり、Mark Story (CakePHP 開発者)はこれを修正する必要があることに同意しています。

セッションに保存されているセッション時間と一緒に Cookie を更新する必要があることに同意できます。ただし、セッション処理のための PHP の内部機能はそうではありません。この問題を回避するには、いくつかの異なる方法があるようです。

ただし、これにより現在の動作が変更されるため (奇妙に思えるかもしれませんが)、修正はバージョン 2.3 に延期されます。

PHP の外部で Cookie の状態を管理することが、最も適切な解決策になると思います。ただし、これが既存のアプリケーションにとってどれほど安全な変更かはわかりません。セッションの仕組みを変えることは劇的な変化になる可能性があり、ユーザーがずっと長くログにとどまることができるようにすることは、すべての開発者が期待していることではないかもしれません。

于 2012-07-19T10:07:40.080 に答える
3

これは、PHP がセッションを処理する方法のようです。PHP は、リクエストごとに Cookie を更新しません ( http://php.net/manual/en/function.session-set-cookie-params.php#100672を参照)。この Cookie の有効期限に依存する代わりに、CakePHP は現在の時刻と実際のセッション タイムアウトを比較しSession::_validAgentAndTime()ます。

于 2012-07-16T14:38:55.060 に答える