私が理解しているかどうかはわかりません:
<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にのみ適用されるようです。そのような機能にはフィルターが必要ですか?
なぜこれが必要なのですか?サーブレット3.0仕様の引用:
HTTPプロトコルでは、クライアントがアクティブでなくなったときに明示的な終了シグナルはありません。これは、クライアントがアクティブでなくなったことを示すために使用できる唯一のメカニズムがタイムアウト期間であることを意味します。
Web-commonsスキーマは、実際にそれを説明しています。
Session-timeout要素は、このWebアプリケーションで作成されたすべてのセッションのデフォルトのセッションタイムアウト間隔を定義します。指定されたタイムアウトは、整数で表す必要があります。
タイムアウトが0以下の場合、コンテナはセッションのデフォルトの動作がタイムアウトしないことを保証します。この要素が指定されていない場合、コンテナはデフォルトのタイムアウト期間を設定する必要があります。
web-commonsスキーマは、_max-age
_要素についても何かを得ました。
このWebアプリケーションによって作成されたセッション追跡Cookieに割り当てられる存続期間(秒単位)。デフォルトは-1です
そして最後の質問に答えるには:
また、web.xmlですべてのCookieを構成する方法はありますか?これはセッションCookieにのみ適用されるようです。そのような機能にはフィルターが必要ですか?
そうは思いません。 IMHOを行う最も簡単な™方法は、サブクラス HttpServletResponseWrapper
addCookie()
メソッドをオーバーライドすることです。
要約すると、次のようになります。
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
何を説明する前に、必ずいくつかのことを理解してください。
あなたの質問から、あなたはすでに最初の項目を知っていますが、おそらく以下のリストの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の絶対タイムスタンプが表示されます。
固定時点を示すmax-age
の値に関する上記の説明の例外は、特別に解釈された値-1
が使用される場合です。このような場合、開発者コンソールに表示されるのは次のとおりです。
…そしてまた この回答 で説明されているように、これはブラウザが「ブラウザセッション」の期間中Cookieを送信し続けることを意味します。サーバーサイドセッションと区別するために、「ブラウザセッション」を引用符で囲んでいます。セッションの概念がブラウザによってどのように理解されるか(たとえば、異なるタブが異なるセッションに対応するかどうか)は、実装によって異なります。
session-timeout
とmax-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がユーザーブラウザに引き続き存在する可能性があります。