web-dev-qa-db-ja.com

Java Webアプリケーションでセッションタイムアウトを動的に設定する方法は?

セッションタイムアウト間隔を変更するには、ユーザーにWebインターフェイスを提供する必要があります。そのため、Webアプリケーションのインストールごとに、セッションのタイムアウトを異なるものにすることができますが、_web.xml_を異なるものにすることはできません。

セッションタイムアウトをプログラムで設定する方法はありますか。たとえば、ServletContextListener.contextInitialized()を使用して、構成された間隔を読み取り、アプリケーションの起動時に設定できますか。

どうもありがとう。

43

ServletContextListenerを使用する代わりに、 HttpSessionListener を使用します。

sessionCreated() メソッドでは、session timeoutをプログラムで設定できます。

public class MyHttpSessionListener implements HttpSessionListener {

  public void sessionCreated(HttpSessionEvent event){
      event.getSession().setMaxInactiveInterval(15 * 60); // in seconds
  }

  public void sessionDestroyed(HttpSessionEvent event) {}

}

そして、listenerdeployment descriptorで定義することを忘れないでください:

<webapp>
...      
  <listener>                                  
    <listener-class>com.example.MyHttpSessionListener</listener-class>
  </listener>
</webapp>

(またはサーブレットバージョン3.0以降では、 @WebListener 注釈)。


それでも、アプリケーションごとに異なるweb.xmlファイルを作成し、そこでセッションタイムアウトを定義することをお勧めします。

<webapp>
...
  <session-config>
    <session-timeout>15</session-timeout> <!-- in minutes -->
  </session-config>
</webapp>
68
Michael

セッションタイムアウトをプログラムで設定する方法はありますか

セッションタイムアウト値を設定するには、基本的に3つの方法があります。

  • 標準の_session-timeout_ファイルで_web.xml_を使用して〜または〜
  • この要素がない場合、サーバーのデフォルトの_session-timeout_値を取得する(したがって、サーバーレベルで構成する)〜または〜
  • サーブレットまたはJSPで HttpSession. setMaxInactiveInterval(int seconds) メソッドを使用してプログラムで作成します。

ただし、後者のオプションはcurrentセッションのタイムアウト値を設定することに注意してください。これはグローバル設定ではありません。

33
Pascal Thivent

別のanwsersが言ったように、セッションリスナーで変更できます。ただし、たとえば、サーブレットで直接変更できます。

getRequest().getSession().setMaxInactiveInterval(123);
1
Topera
セッションタイムアウト間隔を変更するには、ユーザーにWebインターフェイスを提供する必要があります。そのため、Webアプリケーションのインストールごとにセッションのタイムアウトを異なるものにすることができますが、web.xmlを異なるものにすることはできません。

あなたの質問は簡単です。実行時にセッションのタイムアウト間隔を設定する必要があり、Webインターフェイスを介して設定を行う必要があります。サーバーを再起動するオーバーヘッドはありません。

Michaelsの回答を拡張して、あなたの質問に対処します。

論理:構成された値を.propertiesファイルまたはデータベースに保存する必要があります。サーバーの起動時に、保存された値を読み取り、サーバーが起動するまでその変数を使用して変数にコピーします。 configが更新されると、変数も更新されます。それでおしまい。

検査

MyHttpSessionListenerクラス1で、globalSessionTimeoutIntervalという名前の静的変数を作成します。

  1. 静的ブロックを作成し(クラスに初めてアクセスするときにのみ実行される)、config.propertiesファイルからタイムアウト値を読み取り、globalSessionTimeoutInterval変数に値を設定します。

  2. その値を使用してmaxInactiveIntervalを設定します

  3. Webパーツ、つまり管理設定ページ

    a。設定された値を静的変数globalSessionTimeoutIntervalにコピーします。

    b。 config.propertiesファイルに同じ値を書き込みます。 (サーバーを再起動すると、config.propertiesファイルに存在する値でglobalSessionTimeoutIntervalが読み込まれます)

  4. 代替の.propertiesファイルORデータベースに保存します。選択はあなた次第です。

同じことを達成するための論理コード

public class MyHttpSessionListener implements HttpSessionListener 
{
  public static Integer globalSessionTimeoutInterval = null;

  static
  {
      globalSessionTimeoutInterval =  Read value from .properties file or database;
  }
  public void sessionCreated(HttpSessionEvent event)
  {
      event.getSession().setMaxInactiveInterval(globalSessionTimeoutInterval);
  }

  public void sessionDestroyed(HttpSessionEvent event) {}

}

そして、構成コントローラーまたは構成サーブレットで

String valueReceived = request.getParameter(timeoutValue);
if(valueReceived  != null)
{
    MyHttpSessionListener.globalSessionTimeoutInterval = Integer.parseInt(timeoutValue);
          //Store valueReceived to config.properties file or database
}