5

正確に HttpSession の有効期限が切れる時期を知りたいです (破棄されたものとは異なります)。

session.getLastAccessedTime() + (session.getMaxInactiveInterval() * 1000) が、同じセッション ID のリクエストが来るたびにセッションの有効期限がミリ秒単位で正確にわかるかどうかを調べようとしています!

javadoc から:

長い getLastAccessedTime()

  Returns the last time the client sent a request associated with this session, as the number of milliseconds since midnight January 1, 1970 GMT, and marked by the time the container received the request.    

int getMaxInactiveInterval()

  Returns the maximum time interval, in seconds, that the servlet container will keep this session open between client accesses.  

以下があるとしましょう:
Treq1 - the time the container received the 1st request (HttpSession.lastAccessedTime)
Tresp1 - the time the container sends the 1st response
Preq1 - the time period between Treq1 and Tresp1 (the time period that the server processes the 1st request
Treq2 - the time the container received the 2nd request (HttpSession.lastAccessedTime)
Preq1req2 - the time period between Treq1 and Treq2 (the time between requests entering the container)
Presp1req2 -the time period between Tresp1 and Treq2 (the time between the 1st response exiting the container and the 2nd request entering the container)

では、サーバーがセッションを期限切れとして計算するのはいつですか? 条件:
1. Treq1 + maxInactiveInterval < Treq1 + Preq1req2 => maxInactiveInterval < Preq1req2
2. Tresp1 + maxInactiveInterval < Tresp1 + Presp1req2 => maxInactiveInterval < Presp1req2

この部分the servlet container will keep this session open between client accessesは、少し紛らわしいです。リクエストがコンテナに入る間、またはレスポンスが出てからリクエストが入る間を意味しますか?

余談ですが、セッションが有効期限の正確な時間に破棄されない可能性があることはわかっていますが、コンテナでリクエスト処理ロジックが発生する前にセッションが破棄されるかどうかはまだわかりません。期限切れのセッション ID を保持するリクエストについて言及しています。

敬具、
デスポット

4

3 に答える 3

11

セッション メカニズムは、サーブレット仕様の一部であり、以下が義務付けられています。

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

セッションのデフォルトのタイムアウト期間は、サーブレット コンテナーによって定義され、HttpSession インターフェイスの getMaxInactiveInterval メソッドを介して取得できます。このタイムアウトは、開発者が HttpSession インターフェイスの setMaxInactiveInterval メソッドを使用して変更できます。これらのメソッドで使用されるタイムアウト期間は秒単位で定義されます。定義上、セッションのタイムアウト期間が -1 に設定されている場合、セッションは期限切れになりません。セッションの無効化は、そのセッションを使用しているすべてのサーブレットがサービス メソッドを終了するまで有効になりません。セッションの無効化が開始されると、新しいリクエストがそのセッションを認識できてはなりません。

HttpSession インターフェースの getLastAccessedTime メソッドを使用すると、サーブレットは、現在のリクエストの前にセッションが最後にアクセスされた時刻を判別できます。セッションは、セッションの一部であるリクエストが最初にサーブレット コンテナによって処理されたときにアクセスされたと見なされます。

「非アクティブ間隔」が「lastAccessedTime」で始まると想定するのはおそらく安全です。

于 2013-01-04T15:26:24.540 に答える
3

session.getLastAccessedTime() + (session.getMaxInactiveInterval() * 1000) が、同じセッション ID のリクエストが来るたびにセッションの有効期限がミリ秒単位で正確にわかるかどうかを調べようとしています!

リクエストスレッドでのみセッションオブジェクトにアクセスできるため、クライアント(ブラウザ)に次のクリックまでにかかる時間を通知するためのサーブレットに上記のコードがあると仮定しています。タイムアウトカウンターである可能性があります。

System.currentTimeMillis() + (session.getMaxInactiveInterval() * 1000)その場合はより正確になると思います。

于 2013-01-04T09:53:39.610 に答える