コンテキストコンテナ
目次
はじめに
以下の説明では、ほとんどの相対パスが解決されるベースディレクトリを参照するために変数名 $CATALINA_BASE
を使用しています。CATALINA_BASE
ディレクトリを設定して Tomcat を複数インスタンスで構成していない場合、$CATALINA_BASE
は Tomcat をインストールしたディレクトリである $CATALINA_HOME
の値に設定されます。
Context 要素は、特定の仮想ホスト内で実行されるWebアプリケーションを表します。各Webアプリケーションは、サーブレット仕様 (バージョン2.2以降) に記述されているように、Webアプリケーションアーカイブ (WAR) ファイル、または対応する解凍されたコンテンツを含むディレクトリに基づいています。Webアプリケーションアーカイブの詳細については、サーブレット仕様をダウンロードし、Tomcat アプリケーション開発者ガイドを参照してください。
各HTTPリクエストを処理するために使用されるWebアプリケーションは、Catalinaによって、定義された各Contextのコンテキストパスに対してリクエストURIの最長の一致するプレフィックスに基づいて選択されます。選択されると、そのContextは、Webアプリケーションデプロイメントによって定義されたサーブレットマッピングに従って、受信リクエストを処理する適切なサーブレットを選択します。
Context 要素はいくつでも定義できます。各Contextは、仮想ホスト内で一意のコンテキスト名を持つ必要があります。コンテキストパスは一意である必要はありません (以下の並行デプロイを参照)。さらに、コンテキストパスがゼロ長文字列のContextが存在する必要があります。このContextは、この仮想ホストのデフォルトWebアプリケーションとなり、他のContextのコンテキストパスと一致しないすべてのリクエストを処理するために使用されます。
並行デプロイ
同じコンテキストパスを持つWebアプリケーションの複数のバージョンを同時にデプロイできます。リクエストをコンテキストバージョンに一致させるために使用されるルールは次のとおりです
- リクエストにセッション情報がない場合は、最新バージョンを使用します。
- リクエストにセッション情報がある場合は、各バージョンのセッションマネージャーで一致するセッションをチェックし、見つかった場合はそのバージョンを使用します。
- リクエストにセッション情報があるが、一致するセッションが見つからない場合は、最新バージョンを使用します。
Host は、undeployOldVersions
を介して、このようにデプロイされた古いバージョンが使用されなくなったときに削除するように設定できます。
命名
HostによってautoDeploy
またはdeployOnStartup
操作が実行されると、Webアプリケーションの名前とコンテキストパスは、Webアプリケーションを定義するファイルの名前から導出されます。したがって、コンテキストパスはアプリケーションに組み込まれたMETA-INF/context.xml
で定義できない可能性があり、ファイルのコンテキスト名、コンテキストパス、コンテキストバージョン、およびベースファイル名(.war
または.xml
拡張子を除く名前)の間には密接な関係があります。
バージョンが指定されていない場合、コンテキスト名は常にコンテキストパスと同じになります。コンテキストパスが空文字列の場合、ベース名はROOT (常に大文字) となり、それ以外の場合はベース名は先頭の '/' を削除し、残りの '/' 文字を '#' に置き換えたコンテキストパスになります。
バージョンが指定されている場合、コンテキストパスは変更されず、コンテキスト名とベース名の両方に「##」が追加され、その後にバージョン識別子が続きます。
これらの命名規則の例を以下に示します。
コンテキストパス | コンテキストバージョン | コンテキスト名 | ベースファイル名 | ファイル名の例 (.xml, .war & ディレクトリ) |
---|---|---|---|---|
/foo | なし | /foo | foo | foo.xml, foo.war, foo |
/foo/bar | なし | /foo/bar | foo#bar | foo#bar.xml, foo#bar.war, foo#bar |
空文字列 | なし | 空文字列 | ROOT | ROOT.xml, ROOT.war, ROOT |
/foo | 42 | /foo##42 | foo##42 | foo##42.xml, foo##42.war, foo##42 |
/foo/bar | 42 | /foo/bar##42 | foo#bar##42 | foo#bar##42.xml, foo#bar##42.war, foo#bar##42 |
空文字列 | 42 | ##42 | ROOT##42 | ROOT##42.xml, ROOT##42.war, ROOT##42 |
バージョンコンポーネントは、パフォーマンス上の理由とバージョン管理スキームの柔軟性を可能にするために、String
として扱われます。文字列比較を使用してバージョン順序が決定されます。バージョンが指定されていない場合、空文字列として扱われます。したがって、foo.war
は foo##11.war
より古いバージョンとして扱われ、foo##11.war
は foo##2.war
より古いバージョンとして扱われます。純粋な数値バージョン管理スキームを使用する場合は、foo##002.war
が foo##011.war
より古いバージョンとして扱われるように、ゼロパディングを使用することをお勧めします。
サーブレットで現在のWebアプリケーションのバージョン番号を取得するには、org.apache.catalina.webappVersion
属性を次のように使用します: String webappVersion = (String)request.getServletContext().getAttribute("org.apache.catalina.webappVersion");
ベースファイル名に関連しないコンテキストパスを使用してWARファイルまたはディレクトリをデプロイしたい場合は、二重デプロイメントを防ぐために以下のいずれかのオプションを使用する必要があります
- autoDeployとdeployOnStartupを無効にし、すべてのContextをserver.xmlで定義する
- WARまたはディレクトリをHostの
appBase
の外に配置し、docBase
属性を持つcontext.xmlファイルを使用してそれを定義する。
コンテキストの定義
<Context>
要素をserver.xml
ファイルに直接配置することは推奨されません。これは、メインのconf/server.xml
ファイルをTomcatを再起動せずにリロードできないため、Context設定の変更がより侵襲的になるためです。デフォルトのContext要素(下記参照)も、server.xml
に直接配置された<Context>
要素の設定を上書きします。これを防ぐには、server.xml
で定義された<Context>
要素のoverride
属性をtrue
に設定する必要があります。
個々のContext要素は明示的に定義できます。
- アプリケーションファイル内の
/META-INF/context.xml
にある個別のファイル内。オプションで(HostのcopyXML属性に基づき)、これは$CATALINA_BASE/conf/[enginename]/[hostname]/
にコピーされ、アプリケーションのベースファイル名に「.xml」拡張子を加えて名前変更される場合があります。 $CATALINA_BASE/conf/[enginename]/[hostname]/
ディレクトリ内の個々のファイル(「.xml」拡張子を持つ)。コンテキストパスとバージョンは、ファイルのベース名(.xml拡張子を除いたファイル名)から導出されます。このファイルは、WebアプリケーションのMETA-INFディレクトリにパッケージ化されたcontext.xmlファイルよりも常に優先されます。- メインの
conf/server.xml
内のHost要素内。
複数のWebアプリケーションに適用されるデフォルトのContext要素を定義できます。個々のWebアプリケーションの設定は、これらのデフォルトのいずれかで設定されたものを上書きします。デフォルトのContextで定義されたネストされた要素、たとえば<Resource>
要素は、デフォルトが適用される各Contextに対して一度作成されます。それらはContext要素間で共有されません。
$CATALINA_BASE/conf/context.xml
ファイル内: Context要素情報はすべてのWebアプリケーションによってロードされます。$CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default
ファイル内: Context要素情報は、そのホストのすべてのWebアプリケーションによってロードされます。
server.xmlを除き、Context要素を定義するファイルは、単一のContext要素のみを定義できます。
明示的に指定されたContext要素に加えて、Context要素を自動的に作成できるいくつかの方法があります。詳細については、自動アプリケーションデプロイおよびユーザーWebアプリケーションを参照してください。
単一のWARファイルまたはディレクトリを使用する複数のコンテキストを定義するには、ベースファイル名に関連しないパスを持つContextを作成するために、上記の命名セクションで説明されているオプションのいずれかを使用します。
属性
共通属性
Context のすべての実装は、以下の属性をサポートしています
属性 | 説明 |
---|---|
allowCasualMultipartParsing |
ターゲットサーブレットが @MultipartConfig アノテーションでマークされていない場合でも、HttpServletRequest.getPart* または HttpServletRequest.getParameter* が呼び出されたときに Tomcat が multipart/form-data リクエストボディを自動的に解析する必要がある場合、 |
allowMultipleLeadingForwardSlashInPath |
Tomcat は、URI内の複数の |
altDDName |
このコンテキストの代替デプロイメントディスクリプタへの絶対パス。これは、 |
alwaysAccessSession |
これが
|
backgroundProcessorDelay |
この値は、このコンテキストとその子コンテナ(すべてのラッパーを含む)でbackgroundProcessメソッドが呼び出されてから次の呼び出しまでの遅延時間を秒単位で表します。子コンテナは、その遅延値が負でない場合(つまり、独自の処理スレッドを使用している場合)は呼び出されません。これを正の値に設定すると、スレッドが生成されます。指定された時間待機した後、スレッドはこのホストとすべての子コンテナでbackgroundProcessメソッドを呼び出します。コンテキストは、セッションの期限切れや再読み込みのためのクラス監視にバックグラウンド処理を使用します。指定されていない場合、この属性のデフォルト値は-1で、これはコンテキストが親ホストのバックグラウンド処理スレッドに依存することを意味します。 |
className |
使用する実装のJavaクラス名。このクラスは |
containerSciFilter |
このコンテキストで使用すべきでない、コンテナが提供するSCIをフィルタリングするための正規表現。マッチングには |
contextGetResourceRequiresSlash |
これが
|
cookies |
クライアントがサポートしている場合、セッション識別子の通信にCookieを使用したい場合は |
createUploadTargets |
Servlet の |
crossContext |
このアプリケーション内からの |
dispatcherWrapsSameObject |
これが
|
dispatchersUseEncodedPaths |
リクエストディスパッチャを取得するための呼び出しで使用されるパスがエンコードされていると想定されるかどうかを制御します。これは、Tomcatがリクエストディスパッチャを取得するための呼び出しをどのように処理するか、およびTomcatが内部的にリクエストディスパッチャを取得するために使用されるパスをどのように生成するか、の両方に影響します。指定されていない場合、デフォルト値の |
docBase |
このWebアプリケーションのドキュメントベース(コンテキストルートとも呼ばれる)ディレクトリ、またはWebアプリケーションアーカイブファイルへのパス名(このWebアプリケーションがWARファイルから直接実行されている場合)。このディレクトリまたはWARファイルには絶対パス名を指定するか、所有するHostの このフィールドの値は、Context要素がserver.xmlで定義されているか、
|
encodedReverseSolidusHandling |
指定されていない場合、デフォルト値は |
encodedSolidusHandling |
指定されていない場合、デフォルト値は |
failCtxIfServletStartFails |
load-on-startup >=0 のサーブレットの起動が失敗した場合、コンテキストの起動も失敗させるには 指定されていない場合、親Host設定で同じ名前の属性が指定されていればそれが使用されます。そうでなければ、デフォルト値の |
fireRequestListenersOnForwards |
Tomcatがリクエストを転送するときに、設定されているServletRequestListenersを発火させるには |
ignoreAnnotations |
Tomcatがクラスに存在するすべてのアノテーションを無視するようにするには 指定されていない場合、デフォルト値の |
logEffectiveWebXml |
Webアプリケーションが起動するときに、そのWebアプリケーションで使用される実効web.xmlを(INFOレベルで)ログに出力したい場合は |
mapperContextRootRedirectEnabled |
有効になっている場合、Webアプリケーションのコンテキストルートへのリクエストは、デフォルトのサーブレットではなくマッパーによって必要に応じてリダイレクトされます(末尾にスラッシュを追加します)。これはより効率的ですが、セキュリティ上の副作用があります。第一に、ユーザーがそのディレクトリへのアクセス権を持っていなくても、Webアプリケーションまたはディレクトリの存在が確認される可能性があります。第二に、セキュリティ機能を提供するバルブやフィルタを含む、あらゆるバルブやフィルタはリクエストを処理する機会を得られません。指定されていない場合、デフォルト値の |
mapperDirectoryRedirectEnabled |
有効になっている場合、Webアプリケーションディレクトリへのリクエストは、デフォルトのサーブレットではなくマッパーによって必要に応じてリダイレクトされます(末尾にスラッシュを追加します)。これはより効率的ですが、セキュリティ上の副作用があります。第一に、ユーザーがそのディレクトリへのアクセス権を持っていなくても、Webアプリケーションまたはディレクトリの存在が確認される可能性があります。第二に、セキュリティ機能を提供するバルブやフィルタを含む、あらゆるバルブやフィルタはリクエストを処理する機会を得られません。指定されていない場合、デフォルト値の |
override |
グローバルまたはHostのデフォルトコンテキスト内のすべての設定を無視するには |
parallelAnnotationScanning |
|
path |
このWebアプリケーションのコンテキストパス。これは、処理のために適切なWebアプリケーションを選択するために、各リクエストURIの先頭と照合されます。特定のHost内のすべてのコンテキストパスは一意でなければなりません。空文字列("")のコンテキストパスを指定すると、このHostのデフォルトWebアプリケーションを定義することになり、これは他のContextに割り当てられていないすべてのリクエストを処理します。 この属性は、server.xmlでContextを静的に定義する場合にのみ使用する必要があります。その他のすべての状況では、パスは.xmlコンテキストファイルまたは server.xmlでContextを静的に定義する場合でも、 |
preemptiveAuthentication |
|
privileged |
このコンテキストがマネージャーサーブレットのようなコンテナサーブレットを使用できるようにするには |
reloadable |
Catalinaが |
resourceOnlyServlets |
リソースが存在することを期待するサーブレット名( |
sendRedirectBody |
|
sessionCookieDomain |
このコンテキストのために作成されるすべてのセッションクッキーに使用されるドメイン。設定されている場合、Webアプリケーションによって設定されたすべてのドメインを上書きします。設定されていない場合、Webアプリケーションによって指定された値(もしあれば)が使用されます。 |
sessionCookieName |
このコンテキストのために作成されるすべてのセッションクッキーに使用される名前。設定されている場合、Webアプリケーションによって設定されたすべての名前を上書きします。設定されていない場合、Webアプリケーションによって指定された値(もしあれば)が使用されるか、Webアプリケーションが明示的に設定しない場合は |
sessionCookiePath |
このコンテキストのために作成されるすべてのセッションクッキーに使用されるパス。設定されている場合、Webアプリケーションによって設定されたすべてのパスを上書きします。設定されていない場合、Webアプリケーションによって指定された値、またはWebアプリケーションが明示的に設定しない場合は使用されるコンテキストパスが使用されます。すべてのWebアプリケーションが空のパスを使用するように設定するには(これはポートレット仕様の実装に役立ちます)、グローバルな 注: |
sessionCookiePathUsesTrailingSlash |
Internet Explorer、Safari、Edgeなど一部のブラウザは、RFC6265に違反して、 |
suspendWrappedResponseAfterForward |
このフラグの値が |
swallowAbortedUploads |
中断されたアップロードに対してTomcatが追加のリクエストボディデータを読み込まず、代わりにクライアント接続を中止する必要がある場合は
追加データを読み込まないことで、リクエスト処理スレッドをより迅速に解放できます。残念ながら、ほとんどのHTTPクライアントは、完全なリクエストを書き込めない場合、応答を読み込みません。 デフォルトは 注: リクエスト処理中に5xx応答をトリガーするエラーが発生した場合、未読のリクエストデータは常に無視され、エラー応答が書き込まれるとクライアント接続は閉じられます。 |
swallowOutput |
このフラグの値が |
tldValidation |
このフラグの値が |
useHttpOnly |
クライアントサイドスクリプトがセッションIDにアクセスするのを防ぐために、セッションクッキーにHttpOnlyフラグを設定すべきか?デフォルトは |
usePartitioned |
セッションクッキーにPartitionedフラグを設定すべきか?デフォルトは 注: CHIPSの一部としてパーティション化されたクッキーを示すために使用される属性名はRFCによって定義されておらず、同等の機能がRFCに含まれると後方互換性のない方法で変更される可能性があります。 |
useRelativeRedirects |
|
validateClientProvidedNewSessionId |
クライアントが新しいセッションのIDを提供するとき、この属性はそのIDが検証されるかどうかを制御します。クライアントが提供するセッションIDを使用する唯一のユースケースは、複数のWebアプリケーション間で共通のセッションIDを持つことです。したがって、クライアントが提供するセッションIDは、別のWebアプリケーションに既に存在している必要があります。このチェックが有効になっている場合、クライアントが提供するセッションIDは、現在のホストの少なくとも1つの他のWebアプリケーションにセッションIDが存在する場合にのみ使用されます。この設定に関係なく、以下の追加のテストが常に適用されることに注意してください。
指定されていない場合、デフォルト値の |
wrapperClass |
このContextによって管理されるサーブレットに使用される |
xmlBlockExternal |
このフラグの値が |
xmlNamespaceAware |
このフラグの値が |
xmlValidation |
このフラグの値が |
標準実装
Context の標準実装は org.apache.catalina.core.StandardContext です。これは(上記の共通属性に加えて)以下の追加属性をサポートします。
属性 | 説明 |
---|---|
addWebinfClassesResources |
この属性は、WebアプリケーションJARファイル内の |
antiResourceLocking |
これを このフラグを、Hostの |
clearReferencesHttpClientKeepAliveThread |
|
clearReferencesRmiTargets |
|
clearReferencesStopThreads |
|
clearReferencesStopTimerThreads |
|
clearReferencesThreadLocals |
|
copyXML |
アプリケーションに組み込まれたコンテキストXML記述子( |
jndiExceptionOnFailedWrite |
|
notFoundClassResourceCacheSize |
標準リソース実装では、クラスリソースは最初にロードされ、その後リソースが不要になるため、キャッシュされません。しかし、いくつかのシナリオでは同じクラスが何度も検索され、JAR/クラスの数が多いほど検索に時間がかかるため、見つからないクラスをキャッシュすることは役立ちます。LRUキャッシュが使用され、この属性はそのキャッシュのサイズを制御します。1未満の値はキャッシュを無効にします。指定されていない場合、デフォルト値の1000が使用されます。 |
renewThreadsWhenStoppingContext |
|
skipMemoryLeakChecksOnJvmShutdown |
|
unloadDelay |
コンテナがサーブレットのアンロードを待機するミリ秒数。指定されていない場合、デフォルト値は |
unpackWAR |
|
useNaming |
このWebアプリケーションに対して、Jakarta EEプラットフォームの慣例と互換性のあるJNDI |
workDir |
このContextが提供するスクラッチディレクトリへのパス名で、関連するWebアプリケーション内のサーブレットによる一時的な読み書きに使用されます。このディレクトリは、サーブレット仕様に記述されているように、 |
ネストされたコンポーネント
Context 要素内に対応する要素をネストすることにより、以下のユーティリティコンポーネントを最大で1つまでネストできます
- Cookie Processor - HTTPクッキーヘッダーの解析と生成を設定します。
- Loader - このWebアプリケーションのサーブレットおよびBeanクラスをロードするために使用されるWebアプリケーションクラスローダーを設定します。通常、クラスローダーのデフォルト設定で十分です。
- Manager - このWebアプリケーションのHTTPセッションを作成、破棄、および永続化するために使用されるセッションマネージャーを設定します。通常、セッションマネージャーのデフォルト設定で十分です。
- Realm - この特定のWebアプリケーション専用に、ユーザーとその関連ロールのデータベースを利用できるようにするレルムを設定します。指定されていない場合、このWebアプリケーションは所有するHostまたはEngineに関連付けられたレルムを使用します。
- Resources - このWebアプリケーションに関連付けられた静的リソースにアクセスするために使用されるリソースマネージャーを設定します。通常、リソースマネージャーのデフォルト設定で十分です。
- WatchedResource - 自動デプロイヤーは、指定されたWebアプリケーションの静的リソースの更新を監視し、更新された場合にWebアプリケーションをリロードします。この要素の内容は文字列である必要があります。
- JarScanner - JARファイルとクラスファイルのディレクトリについてWebアプリケーションをスキャンするために使用されるJarスキャナーを設定します。これは通常、Webアプリケーションの初期化の一部として処理する必要があるTLDやweb-fragment.xmlファイルなどの設定ファイルを識別するために、Webアプリケーションの起動時に使用されます。通常、デフォルトのJarスキャナー設定で十分です。
特別な機能
ロギング
コンテキストは、org.apache.catalina.core.ContainerBase.[enginename].[hostname].[path]
ログカテゴリに関連付けられています。角括弧は実際には名前の一部であり、省略しないでください。
アクセスログ
Webサーバーを実行すると、通常生成される出力ファイルの1つにアクセスログがあります。これは、サーバーによって処理された各リクエストについて、標準形式で1行の情報を生成します。Catalinaには、Webサーバーによって作成されたのと同じ標準形式、または任意の数のカスタム形式でアクセスログを作成できる、オプションのValve実装が含まれています。
Catalinaに、Engine、Host、またはContextによって処理されるすべてのリクエストのアクセスログを作成するように依頼するには、次のようにValve要素をネストします
<Context>
...
<Valve className="org.apache.catalina.valves.AccessLogValve"
prefix="localhost_access_log" suffix=".txt"
pattern="common"/>
...
</Context>
サポートされている設定属性の詳細については、アクセスログバルブを参照してください。
自動コンテキスト設定
標準のContext実装を使用すると、Catalinaが起動したとき、またはこのWebアプリケーションがリロードされるたびに、以下の設定手順が自動的に実行されます。この機能を有効にするために特別な設定は必要ありません。
- 独自のLoader要素を宣言していない場合、標準のWebアプリケーションクラスローダーが設定されます。
- 独自のManager要素を宣言していない場合、標準のセッションマネージャーが設定されます。
- 独自のResources要素を宣言していない場合、標準のリソースマネージャーが設定されます。
conf/web.xml
にリストされているWebアプリケーションプロパティは、このWebアプリケーションのデフォルトとして処理されます。これは、デフォルトのマッピング(*.jsp
拡張子を対応するJSPサーブレットにマッピングするなど)や、すべてのWebアプリケーションに適用されるその他の標準機能を確立するために使用されます。- このWebアプリケーションの
/WEB-INF/tomcat-web.xml
リソースにリストされているWebアプリケーションプロパティは、(このリソースが存在する場合)処理され、デフォルトよりも優先されます。 - このWebアプリケーションの
/WEB-INF/web.xml
リソースにリストされているWebアプリケーションプロパティは、(このリソースが存在する場合)処理されます。 - Webアプリケーションにユーザー認証が必要となる可能性のあるセキュリティ制約が指定されている場合、選択したログインメソッドを実装する適切なオーセンティケータが設定されます。
コンテキストパラメータ
この要素内に<Parameter>
要素をネストすることで、Webアプリケーションにサーブレットコンテキスト初期化パラメータとして表示される名前付き値を設定できます。例えば、次のように初期化パラメータを作成できます。
<Context>
...
<Parameter name="companyName" value="My Company, Incorporated"
override="false"/>
...
</Context>
これは、Webアプリケーションデプロイメントディスクリプタ(/WEB-INF/web.xml
)に以下の要素を含めることと等価です。
<context-param>
<param-name>companyName</param-name>
<param-value>My Company, Incorporated</param-value>
</context-param>
ただし、この値をカスタマイズするためにデプロイメントディスクリプタの変更は不要です。
<Parameter>
要素の有効な属性は以下のとおりです。
属性 | 説明 |
---|---|
description |
オプション。このコンテキスト初期化パラメータの人間が読める説明。 |
name |
作成するコンテキスト初期化パラメータの名前。 |
override |
Webアプリケーションデプロイメントディスクリプタで見つかった同じパラメータ名に対する |
value |
|
環境エントリ
この要素内に<Environment>
エントリをネストすることで、環境エントリリソースとしてWebアプリケーションに表示される名前付き値を設定できます。例えば、次のように環境エントリを作成できます。
<Context>
...
<Environment name="maxExemptions" value="10"
type="java.lang.Integer" override="false"/>
...
</Context>
これは、Webアプリケーションデプロイメントディスクリプタ(/WEB-INF/web.xml
)に以下の要素を含めることと等価です。
<env-entry>
<env-entry-name>maxExemptions</env-entry-name>
<env-entry-value>10</env-entry-value>
<env-entry-type>java.lang.Integer</env-entry-type>
</env-entry>
ただし、この値をカスタマイズするためにデプロイメントディスクリプタの変更は不要です。
<Environment>
要素の有効な属性は以下のとおりです。
属性 | 説明 |
---|---|
description |
オプション。この環境エントリの人間が読める説明。 |
name |
|
override |
Webアプリケーションデプロイメントディスクリプタで見つかった同じ環境エントリ名に対する |
type |
この環境エントリについて、Webアプリケーションが期待する完全修飾Javaクラス名。Webアプリケーションデプロイメントディスクリプタの |
value |
JNDIコンテキストから要求されたときにアプリケーションに提示されるパラメータ値。この値は、 |
ライフサイクルリスナー
このContextが開始または停止されるタイミングを知る必要があるJavaオブジェクトを実装している場合、この要素内にListener要素をネストすることでそれを宣言できます。指定するクラス名はorg.apache.catalina.LifecycleListener
インターフェースを実装している必要があり、クラスはjarにパッケージ化され、$CATALINA_HOME/lib
ディレクトリに配置されている必要があります。対応するライフサイクルイベントの発生について通知されます。このようなリスナーの設定は次のようになります。
<Context>
...
<Listener className="com.mycompany.mypackage.MyListener" ... >
...
</Context>
リスナーは、この要素から設定できる任意の数の追加プロパティを持つことができることに注意してください。属性名は、標準のプロパティメソッド命名パターンを使用して、対応するJavaBeanプロパティ名と照合されます。
リクエストフィルタ
Catalinaに、囲んでいるEngine、Host、またはContext要素に向けられたすべての受信リクエストについて、IPアドレスまたはホスト名をチェックするように依頼できます。リモートアドレスまたは名前は、java.util.regex
正規表現構文を使用して定義された「許可」および/または「拒否」フィルタと照合されます。許可されていない場所からのリクエストは、HTTP「Forbidden」エラーで拒否されます。フィルタ宣言の例:
<Context>
...
<Valve className="org.apache.catalina.valves.RemoteHostValve"
allow=".*\.mycompany\.com|www\.yourcompany\.com"/>
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="192\.168\.1\.\d+"/>
...
</Context>
サポートされている設定オプションの詳細については、リモートアドレスフィルタとリモートホストフィルタを参照してください。
リソース定義
Webアプリケーションデプロイメントディスクリプタの<resource-ref>
および<resource-env-ref>
要素のJNDIルックアップによって返されるリソースの特性を宣言できます。使用するオブジェクトファクトリ(Tomcatにまだ知られていない場合)と、そのオブジェクトファクトリを設定するために使用されるプロパティを設定するために、必要なリソースパラメータをResource
要素の属性として定義する必要があります。
例えば、次のようにリソース定義を作成できます。
<Context>
...
<Resource name="jdbc/EmployeeDB" auth="Container"
type="javax.sql.DataSource"
description="Employees Database for HR Applications"/>
...
</Context>
これは、Webアプリケーションデプロイメントディスクリプタ(/WEB-INF/web.xml
)に以下の要素を含めることと等価です。
<resource-ref>
<description>Employees Database for HR Applications</description>
<res-ref-name>jdbc/EmployeeDB</res-ref-name>
<res-ref-type>javax.sql.DataSource</res-ref-type>
<res-auth>Container</res-auth>
</resource-ref>
ただし、この値をカスタマイズするためにデプロイメントディスクリプタの変更は不要です。
<Resource>
要素の有効な属性は以下のとおりです。
属性 | 説明 |
---|---|
auth |
Webアプリケーションコードが対応するリソースマネージャーにプログラムでサインオンするか、またはコンテナがアプリケーションに代わってリソースマネージャーにサインオンするかを指定します。この属性の値は |
closeMethod |
シングルトンリソースが不要になったときに呼び出す引数なしメソッドの名前。これは、ガベージコレクションの一部として行われるはずのリソースのクリーンアップを高速化することを目的としています。 Apache Commons DBCP 2 やデフォルトのApache Tomcatコネクションプールなど、 |
description |
オプション。このリソースの人間が読める説明。 |
name |
|
scope |
このリソースマネージャーを介して取得した接続を共有できるかどうかを指定します。この属性の値は |
singleton |
このリソース定義がシングルトンリソース(すなわち、リソースの単一インスタンスのみが存在するリソース)であるかどうかを指定します。この属性が |
type |
Webアプリケーションがこのリソースのルックアップを実行するときに期待する完全修飾Javaクラス名。 |
リソースリンク
この要素は、グローバルJNDIリソースへのリンクを作成するために使用されます。リンク名でJNDIルックアップを実行すると、リンクされたグローバルリソースが返されます。
例えば、次のようにリソースリンクを作成できます。
<Context>
...
<ResourceLink name="linkToGlobalResource"
global="simpleValue"
type="java.lang.Integer"
...
</Context>
<ResourceLink>
要素の有効な属性は以下のとおりです。
属性 | 説明 |
---|---|
global |
グローバルJNDIコンテキスト内のリンクされたグローバルリソースの名前。 |
name |
|
type |
Webアプリケーションがこのリソースリンクのルックアップを実行するときに期待する完全修飾Javaクラス名。 |
factory |
これらのオブジェクトを作成するクラスの完全修飾Javaクラス名。このクラスは |
属性factory="org.apache.naming.factory.DataSourceLinkFactory"
が指定された場合、リソースリンクは2つの追加属性とともに使用され、共有データソースを異なる資格情報で使用できます。これらの2つの追加属性がjavax.sql.DataSource
型と組み合わせて使用される場合、異なるコンテキストが異なる資格情報でグローバルデータソースを共有できます。内部的には、getConnection()
への呼び出しは、単にグローバルデータソースに対するgetConnection(username, password)
への呼び出しに変換されます。これは、どのスキーマが使用されているかに対してコードを透過的に保ちながら、グローバル設定で接続(またはプール)を制御できる簡単な方法です。
属性 | 説明 |
---|---|
username |
リンクされたグローバルDataSourceへの |
password |
リンクされたグローバルDataSourceへの |
共有データソースの例
警告: この機能は、グローバルDataSourceがgetConnection(username, password)
メソッドをサポートしている場合にのみ機能します。Tomcatがデフォルトで使用するApache Commons DBCP 2プールはこれをサポートしていません。BasicDataSource
クラスのJavadocを参照してください。Apache Tomcat JDBCプールはこれをサポートしていますが、デフォルトではこのサポートは無効になっており、alternateUsernameAllowed
属性によって有効にできます。詳細はそのドキュメントを参照してください。
<GlobalNamingResources>
...
<Resource name="sharedDataSource"
global="sharedDataSource"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
alternateUsernameAllowed="true"
username="bar"
password="barpass"
...
...
</GlobalNamingResources>
<Context path="/foo"...>
...
<ResourceLink
name="appDataSource"
global="sharedDataSource"
type="javax.sql.DataSource"
factory="org.apache.naming.factory.DataSourceLinkFactory"
username="foo"
password="foopass"
...
</Context>
<Context path="/bar"...>
...
<ResourceLink
name="appDataSource"
global="sharedDataSource"
type="javax.sql.DataSource"
...
</Context>
/foo
コンテキストでgetConnection()
のリクエストが行われると、そのリクエストはgetConnection("foo","foopass")
に変換されます。一方、/bar
でのリクエストはそのまま渡されます。
トランザクション
java:comp/UserTransaction
のJNDIルックアップによって返されるUserTransactionの特性を宣言できます。このオブジェクトをインスタンス化するためのオブジェクトファクトリクラス、および必要なリソースパラメータをTransaction
要素の属性として、さらにそのオブジェクトファクトリを設定するために使用されるプロパティを定義する必要があります。
<Transaction>
要素の有効な属性は以下のとおりです。
属性 | 説明 |
---|---|
factory |
JNDIオブジェクトファクトリのクラス名。 |