Manager コンポーネント
目次
はじめに
Manager 要素は、関連付けられた Web アプリケーションによって要求された HTTP セッションを作成および維持するために使用されるセッションマネージャーを表します。
Manager 要素は、Context コンポーネント内にネストできます。含まれていない場合は、デフォルトの Manager 構成が自動的に作成されます。これはほとんどの要件には十分です。この構成の詳細については、下記の標準 Manager 実装を参照してください。
属性
共通属性
Manager のすべての実装は、次の属性をサポートしています。
属性 | 説明 |
---|---|
className |
使用する実装の Java クラス名。このクラスは |
maxActiveSessions |
この Manager によって作成されるアクティブセッションの最大数。制限がない場合は 制限に達すると、新しいセッションを作成しようとする試み(例: |
notifyAttributeListenerOnUnchangedValue |
セッションに属性が追加され、その属性が同じ名前でセッションに既に存在する場合、 |
notifyBindingListenerOnUnchangedValue |
セッションに属性が追加され、その属性が同じ名前でセッションに既に存在し、属性が |
sessionActivityCheck |
これが
|
sessionLastAccessAtStart |
これが
|
標準実装
Tomcat には、使用するための 2 つの標準的な Manager の実装が用意されています。デフォルトの実装ではアクティブセッションが保存され、オプションの実装では(Tomcat の再起動時にセッションを保存することに加えて)適切な Store ネスト要素の使用によって選択されたストレージロケーションにスワップアウトされたアクティブセッションが保存されます。
標準 Manager 実装
Manager の標準実装は org.apache.catalina.session.StandardManager です。これは、次の追加属性(上記の共通属性に加えて)をサポートしています。
属性 | 説明 |
---|---|
pathname |
可能であれば、アプリケーションの再起動時にセッションの状態が保持されるファイルの絶対パスまたは相対パス(この Context の作業ディレクトリに対する)。デフォルトは null です。 |
persistAuthentication |
アプリケーションの再起動時にセッションの状態を保持するときに、認証情報を含める必要がありますか? セッションの |
processExpiresFrequency |
セッションの有効期限切れおよび関連するマネージャー操作の頻度。マネージャー操作は、指定されたバックグラウンド処理呼び出しの回数ごとに 1 回実行されます(つまり、回数が少ないほど、チェックの頻度が高くなります)。最小値は 1 で、デフォルト値は 6 です。 |
secureRandomClass |
セッション ID を生成するために使用する |
secureRandomProvider |
セッション ID を生成する |
secureRandomAlgorithm |
セッション ID を生成する |
sessionAttributeNameFilter |
クラスタリング/レプリケーション、または永続ストアへの保存のためにシリアル化されるセッション属性をフィルタリングするために使用される正規表現。属性は、その名前がこのパターンに一致する場合にのみシリアル化されます。パターンが長さ 0 または |
sessionAttributeValueClassNameFilter |
クラスタリング/レプリケーション、または永続ストアへの保存のためにシリアル化されるセッション属性をフィルタリングするために使用される正規表現。属性は、値の実装クラス名がこのパターンに一致する場合にのみシリアル化されます。パターンが長さ 0 または |
warnOnSessionAttributeFilterFailure |
sessionAttributeNameFilter または sessionAttributeValueClassNameFilter が属性をブロックした場合、これを |
永続 Manager 実装
注:永続マネージャーが正しく機能するには、org.apache.catalina.session.StandardSession.ACTIVITY_CHECK
または org.apache.catalina.STRICT_SERVLET_COMPLIANCE
の システムプロパティ を true
に設定する必要があります。
Manager の永続実装は org.apache.catalina.session.PersistentManager です。PersistentManager
は、セッションを作成および削除する通常の操作に加えて、アクティブ(ただしアイドル)セッションを永続ストレージメカニズムにスワップアウトし、Tomcat の通常の再起動時にすべてのセッションを保存する機能を備えています。使用される実際の永続ストレージメカニズムは、Manager 要素内にネストされた Store 要素の選択によって決定されます。これは PersistentManager
を使用するために必須です。
この Manager の実装は、共通属性 に加えて、次の属性をサポートしています。
属性 | 説明 |
---|---|
className |
これは、上記の 共通属性 で説明されているのと同じ意味を持ちます。このマネージャー実装を使用するには、 |
maxIdleBackup |
セッションがセッションストアに永続化される対象になるまでの、最後のセッションアクセスからの時間間隔(秒単位)。この機能を無効にするには |
maxIdleSwap |
非アクティブのためにディスクにスワップされる対象になるまでのセッションの最大アイドル時間。これを |
minIdleSwap |
アクティブセッション数を maxActiveSessions 未満に保つためにディスクにスワップされる対象になるまでのセッションの最小アイドル時間(秒単位)。 |
persistAuthentication |
セッションが永続ストレージにスワップアウトされるときに認証情報を含める必要がありますか? セッションの |
processExpiresFrequency |
これは、 |
saveOnRestart |
Tomcat がシャットダウンして再起動されたとき(またはこのアプリケーションがリロードされたとき)に、すべてのセッションを永続化してリロードする必要がありますか?デフォルトでは、この属性は |
secureRandomClass |
これは、 |
secureRandomProvider |
これは、 |
secureRandomAlgorithm |
これは、 |
sessionAttributeNameFilter |
クラスタリング/レプリケーション、または永続ストアへの保存のためにシリアル化されるセッション属性をフィルタリングするために使用される正規表現。属性は、その名前がこのパターンに一致する場合にのみシリアル化されます。パターンが長さ 0 または |
sessionAttributeValueClassNameFilter |
クラスタリング/レプリケーション、または永続ストアへの保存のためにシリアル化されるセッション属性をフィルタリングするために使用される正規表現。属性は、値の実装クラス名がこのパターンに一致する場合にのみシリアル化されます。パターンが長さ 0 または |
warnOnSessionAttributeFilterFailure |
sessionAttributeNameFilter または sessionAttributeValueClassNameFilter が属性をブロックした場合、これを |
PersistentManager を正常に使用するには、以下で説明するように、その内部に <Store> 要素をネストする必要があります。
ネストされたコンポーネント
すべての Manager 実装
すべての Manager 実装では、<SessionIdGenerator> 要素のネストが可能です。これは、セッション ID 生成の動作を定義します。SessionIdGenerator のすべての実装では、次の属性を使用できます。
属性 | 説明 |
---|---|
sessionIdLength |
セッション ID の長さは、sessionIdLength 属性で変更できます。 |
永続 Manager 実装
上記で説明したPersistent Manager 実装を使用している場合、永続データストレージの特性を定義する<Store>要素を必ず内部にネストする必要があります。現在、<Store>
要素には2つの実装が利用可能であり、それぞれ異なる特性を持っています。以下で説明します。
ファイルベースストア
ファイルベースストア実装は、スワップアウトされたセッションを、設定可能なディレクトリ内の個別のファイル(セッション識別子に基づいて名前が付けられます)に保存します。そのため、アクティブなセッション数が増加するとスケーラビリティの問題が発生する可能性が高く、これは主に実験を容易にするための手段として考慮する必要があります。
これを設定するには、<Manager>
要素内にネストされた<Store>
を以下の属性で追加します。
属性 | 説明 |
---|---|
className |
使用する実装の Java クラス名。このクラスは、 |
directory |
個々のセッションファイルが書き込まれるディレクトリの絶対パスまたは相対パス(この Web アプリケーションの一時作業ディレクトリからの相対パス)。指定しない場合は、コンテナによって割り当てられた一時作業ディレクトリが使用されます。 |
データソースベースストア
データソースベースストア実装は、スワップアウトされたセッションを、データソース経由でアクセスされるデータベース内の事前に設定されたテーブルの個々の行に保存します。多数のスワップアウトされたセッションがある場合、この実装は上記のファイルベースストアよりもパフォーマンスが向上します。
これを設定するには、<Manager>
要素内にネストされた<Store>
を以下の属性で追加します。
属性 | 説明 |
---|---|
className |
使用する実装の Java クラス名。このクラスは、 |
dataSourceName |
JDBC DataSource ファクトリの JNDI リソースの名前。このコードはプリペアドステートメントを使用するため、JNDI リソースの How-To に示すように、プールされたプリペアドステートメントを設定することが推奨されます。 |
localDataSource |
これにより、Store はグローバル DataSource ではなく、コンテキスト用に定義された DataSource を使用できます。指定しない場合、デフォルトは |
sessionAppCol |
指定されたセッションテーブルに含まれる、 |
sessionDataCol |
指定されたセッションテーブルに含まれる、スワップアウトされたセッションのすべてのセッション属性のシリアル化された形式を含むデータベース列の名前。列の型は、バイナリオブジェクト(通常は BLOB と呼ばれます)を受け入れる必要があります。指定しない場合は、デフォルト値の |
sessionIdCol |
指定されたセッションテーブルに含まれる、スワップアウトされたセッションのセッション識別子を含むデータベース列の名前。列の型は、Tomcat によって作成されたセッション識別子に含まれる文字数以上(通常は 32 文字)の文字列データを受け入れる必要があります。指定しない場合は、デフォルト値の |
sessionLastAccessedCol |
指定されたセッションテーブルに含まれる、このセッションの |
sessionMaxInactiveCol |
指定されたセッションテーブルに含まれる、このセッションの |
sessionTable |
スワップアウトされたセッションを格納するために使用されるデータベーステーブルの名前。このテーブルには、この要素の他の属性によって構成されるデータベース列(少なくとも)が含まれている必要があります。指定しない場合は、デフォルト値の |
sessionValidCol |
指定されたセッションテーブルに含まれる、このスワップアウトされたセッションがまだ有効かどうかを示すフラグを含むデータベース列の名前。列の型は、単一の文字を受け入れる必要があります。指定しない場合は、デフォルト値の |
データソースストアを初めて使用する前に、スワップアウトされたセッションを格納するために使用するテーブルを作成する必要があります。詳細な SQL コマンドは使用しているデータベースによって異なりますが、一般的に次のようなスクリプトが必要になります。
create table tomcat_sessions (
session_id varchar(100) not null primary key,
valid_session char(1) not null,
max_inactive int not null,
last_access bigint not null,
app_name varchar(255),
session_data mediumblob,
KEY kapp_name(app_name)
);
注: 上記の SQL コマンドは、テーブルまたは列のいずれにもデフォルトの名前を使用していないため、データソースストアはこの構成を反映するように構成する必要があります。
特別な機能
再起動時の永続化
Apache Tomcat が正常にシャットダウンして再起動された場合、またはアプリケーションのリロードがトリガーされた場合、標準マネージャー実装は、pathname
属性によって特定されたディスクファイルに現在アクティブなすべてのセッションをシリアル化しようとします。保存されたすべてのセッションは、アプリケーションのリロードが完了したときに、逆シリアル化されてアクティブ化されます(その間に期限切れになっていない場合)。
セッション属性の状態を正常に復元するには、そのようなすべての属性がjava.io.Serializable
インターフェースを実装必須です。Web アプリケーションのデプロイメント記述子(/WEB-INF/web.xml
)に<distributable>
要素を含めることで、マネージャーにこの制限を強制させることができます。
persistAuthenticationもtrue
に設定されている場合、セッションに存在するPrincipal
クラスも、認証の永続化を正常に機能させるためにはjava.io.Serializable
インターフェースを実装必須であることに注意してください。Principal
クラスの実際の型は、アプリケーションで使用されるRealm実装によって決定されます。Tomcat の標準のPrincipal
クラス(ほとんどの Realm(JAASRealm
を除く)によってインスタンス化されます)は、java.io.Serializable
を実装しています。
StandardManagerによって提供される再起動時の永続化は、PersistentManagerによって提供されるものよりも単純な実装です。再起動時の堅牢な本番品質の永続化が必要な場合は、適切な構成でPersistentManagerを使用する必要があります。
セッションの永続化を有効にする
上記のように、すべての Web アプリケーションにはデフォルトで標準マネージャー実装が構成されており、再起動時のセッションの永続化を実行できます。この永続化機能を有効にするには、Web アプリケーション用のContext設定ファイルを作成し、そこに次の要素を追加します(この例では、セッションをSESSIONS.ser
という名前のファイルに保存します)。
<Manager pathname="SESSIONS.ser" />