web-dev-qa-db-ja.com

web.xmlのsession-timeoutとmax-ageの違いは何ですか?

私が理解しているかどうかはわかりません:

<session-config>
    <session-timeout>30</session-timeout> <!-- 30 minutes! -->
    <cookie-config>
        <http-only>true</http-only>
        <max-age>1800</max-age> <!-- 1800 seconds: 30 minutes! -->
    </cookie-config>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>

また、web.xmlですべてのCookieを構成する方法はありますか?これはセッションCookieにのみ適用されるようです。そのような機能にはフィルターが必要ですか?

9
Koray Tugay

なぜこれが必要なのですか?サーブレット3.0仕様の引用:

HTTPプロトコルでは、クライアントがアクティブでなくなったときに明示的な終了シグナルはありません。これは、クライアントがアクティブでなくなったことを示すために使用できる唯一のメカニズムがタイムアウト期間であることを意味します。

Web-commonsスキーマは、実際にそれを説明しています。

Session-timeout要素は、このWebアプリケーションで作成されたすべてのセッションのデフォルトのセッションタイムアウト間隔を定義します。指定されたタイムアウトは、整数で表す必要があります。

タイムアウトが0以下の場合、コンテナはセッションのデフォルトの動作がタイムアウトしないことを保証します。この要素が指定されていない場合、コンテナはデフォルトのタイムアウト期間を設定する必要があります。


web-commonsスキーマは、_max-age_要素についても何かを得ました。

このWebアプリケーションによって作成されたセッション追跡Cookieに割り当てられる存続期間(秒単位)。デフォルトは-1です


そして最後の質問に答えるには:

また、web.xmlですべてのCookieを構成する方法はありますか?これはセッションCookieにのみ適用されるようです。そのような機能にはフィルターが必要ですか?

そうは思いません。 IMHOを行う最も簡単な™方法は、サブクラス HttpServletResponseWrapperaddCookie()メソッドをオーバーライドすることです。


要約すると、次のようになります。

  • session-timeoutは、アクティブでない場合でも、sessionがサーバーリソースの消費にとどまる時間を設定しますアクセスしました。

  • max-ageは、クライアントブラウザがセッションCookieを保持する期間を設定します。この設定は、cookieの存続期間にのみ適用されます。URL書き換えを使用している場合は何もしません。また、セッションの長さとはまったく関係ありません。サーバー側に保持されます。デフォルトの-1は、ブラウザセッションがアクティブである限り、cookieを保持します。


便利なリンク:

サーブレット3.1JSR-340仕様ページ:
http://download.Oracle.com/otndocs/jcp/servlet-3_1-fr-eval-spec/index.html

Web-commons XSDは、次の場所で入手できます。
http://www.Oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/web-common_3_0.xsd

19
Luiz Tavares

何を説明する前に、必ずいくつかのことを理解してください。

あなたの質問から、あなたはすでに最初の項目を知っていますが、おそらく以下のリストの2番目の項目について混乱していることは明らかです。

  • 2つの設定は異なる単位を使用します:session-timeoutにあり、max-ageにあります秒
  • 彼らはさまざまな方法で時間を測定します:session-timeout相対方法で時間を測定し、max-age絶対方法(以下でさらに説明)
  • それらは考慮され、さまざまなソフトウェアコンポーネントによって適用されます。 session-timeoutはコンテナによって考慮されますが、max-ageは考慮され、ユーザーのブラウザによって適用されます。同様に、session-timeoutはサーバー側に適用され、max-ageはクライアント側に適用されると言えます。

session-timeoutは、コンテナがサーバー内の「接続」を表すセッションオブジェクトを破棄することを決定する前に、最大アイドル期間を示します。これは、session-timeoutの値をわずか1分に設定しても、ブラウザがHTTP GETを送信する限り、セッションオブジェクトをサーバーに保持できることを意味しますforever、POSTなど59秒に1回サーバーにメッセージを送信します。

max-ageは、絶対的な固定時点を計算するためにユーザーのブラウザによって使用されます。それを超えると、セッションCookie(JavaではJSESSIONID)はサーバーに送信されなくなります。これは絶対値であり、そのため、ユーザーに代わってアクティブまたは非アクティブしても違いはありません。そのため、ブラウザの開発者コンソールでCookieを調べると、セッションCookieの絶対タイムスタンプが表示されます。

enter image description here


警告

固定時点を示すmax-ageの値に関する上記の説明の例外は、特別に解釈された値-1が使用される場合です。このような場合、開発者コンソールに表示されるのは次のとおりです。

enter image description here

…そしてまた この回答 で説明されているように、これはブラウザが「ブラウザセッション」の期間中Cookieを送信し続けることを意味します。サーバーサイドセッションと区別するために、「ブラウザセッション」を引用符で囲んでいます。セッションの概念がブラウザによってどのように理解されるか(たとえば、異なるタブが異なるセッションに対応するかどうか)は、実装によって異なります。

session-timeoutmax-ageのセマンティクスが異なるとすると、質問で提供したweb.xmlの抜粋のように2つの値を「整列」させようとします。

<session-config>
    <session-timeout>30</session-timeout> <!-- 30 minutes! -->
    <cookie-config>
        <http-only>true</http-only>
        <max-age>1800</max-age> <!-- 1800 seconds: 30 minutes! -->
    </cookie-config>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>

…おそらく混乱を示しています。

max-ageはハード制限を提供しますが(特別な値-1が使用されない限り)、ユーザーがアクティブにセッションを使用している限り、session-timeoutは事実上制限を提供しません。

デフォルトの特別に解釈された値(0の場合はsession-timeout-1の場合はmax-age)、および(セッションだけでなく)すべてのCookieにこれらの値を構成できるかどうかについてcookie)、これらのポイントは この回答 で説明されています。

<session-timeout>は、未使用のセッションの最大期間です(最後のリクエストの時点から)。セッションがその時間使用されない(要求がない)場合、サーバー側アプリケーションはセッションを強制終了します(このイベントをキャッチして独自の動作を実装できます)。

セッションCookiemax-ageは、このCookieがユーザーのブラウザに保存される期間を定義します。

結論として、セッションCookieが最大年齢に達すると、セッションは強制的に切断されます。それ以外の場合、セッションがsession-timemoutイベントによって切断された場合、セッションCookieがユーザーブラウザに引​​き続き存在する可能性があります。

1
ikken