JavaでHttpSessionをタイムアウトしようとしています。私のコンテナはWebLogicです。
現在、このようにweb.xmlファイルにセッションタイムアウトを設定しています
<session-config>
<session-timeout>15</session-timeout>
</session-config>
今、私はこれがセッションに関係なく、15分でセッションを終了する(またはすべてのセッションですか?)と言われています。
このアプローチが正しいものかどうか、またはプログラムによって非アクティブの時間制限を設定する必要がありますか?
session.setMaxInactiveInterval(15 * 60); //15 minutes
15分ですべてのセッションをドロップするのではなく、15分間アクティブでないセッションのみをドロップします。
これらの方法は同等ですか? web.xml configを優先すべきですか?
今、私はこれがセッションの終了(またはそれはすべてのセッションですか?)の使用の15分で、彼らの活動に関係なく終了すると言われています。
これはwrongです。関連付けられたクライアント(webbrowser)が15分以上ウェブサイトにアクセスしなかった場合、セッションを強制終了します。アクティビティは、最初に予想したとおりに、これを解決するためのあなたの試みを見て、確かに重要です。
HttpSession#setMaxInactiveInterval()
は、ここではあまり変わりません。 <session-timeout>
のweb.xml
とまったく同じですが、実行時にプログラムで変更/設定できる点が異なります。ちなみに、変更は現在のセッションインスタンスにのみ影響し、グローバルには影響しません(そうでない場合はstatic
メソッドでした)。
このyourselfを試してみるには、<session-timeout>
を1分に設定して、次のように HttpSessionListener
を作成してください。
@WebListener
public class HttpSessionChecker implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
System.out.printf("Session ID %s created at %s%n", event.getSession().getId(), new Date());
}
public void sessionDestroyed(HttpSessionEvent event) {
System.out.printf("Session ID %s destroyed at %s%n", event.getSession().getId(), new Date());
}
}
(サーブレット3.0をまだ使用していないため、@WebListener
を使用できない場合は、次のようにweb.xml
に登録します):
<listener>
<listener-class>com.example.HttpSessionChecker</listener-class>
</listener>
Servletcontainerは、exactlyタイムアウト値の後、すぐにセッションを破棄しないことに注意してください。これは、一定の間隔で実行されるバックグラウンドジョブです(たとえば、負荷とservletcontainerのmake/typeに応じて5〜15分)。したがって、ちょうど1分間の非アクティブ状態の直後にコンソールにdestroyed
行が表示されなくても驚かないでください。ただし、タイムアウトしてまだ破棄されていないセッションでHTTPリクエストを実行すると、すぐに破棄されます。
今、私は彼らの活動に関係なく、使用の15分でセッションを終了する(またはすべてのセッションですか?)と言われています。
いいえ、そうではありません。 session-timeout
は、非アクティブの場合のセッションごとのタイムアウトを設定します。
これらの方法は同等ですか? web.xml構成を優先すべきですか?
Web.xmlの設定はグローバルであり、特定のコンテキストのすべてのセッションに適用されます。プログラムにより、特定のセッションに対してこれを変更できます。