TomcatはコンテキストごとのdocBase配下(デフォルトでは「webapps/コンテキスト名」)のリソースを参照します。Tomcat 7から採用されたaliases機能を利用すると、任意のディレクトリにあるHTML、画像などの静的なリソースがdocBaseの配下に配置されているように見せかけることが可能になります。要するに、Apache HTTP Serverの「Alias」と同じような機能です。
以下のようにContextにaliases属性を設定すると、「http://【ホスト】/【コンテキスト】/aliasPath1/【xxx】」で該当リソースxxxにリクエスト可能になります。
<Context aliases="/aliasPath1=docBase1,/aliasPath2=docBase2" />
<Resource>のcloseMethod属性(デフォルト未設定)を設定することで、Webアプリケーションの停止時にcloseMethod属性を設定したリソースに対してクローズ処理を呼び出せます。
例えば、Apache Commonsの「DBCP」「jdbc-pool」をJNDIリソースとして登録した場合、DBCPやjdbc-poolのjavax.sql.DataSource実装クラスはcloseメソッドを提供しているため、<Resource>のcloseMethod属性に「close」と設定することで、そのWebアプリケーションの停止時にデータベースコネクションプールをクリアできます。
また、timeBetweenEvictionRunsMillisを設定することによって起動するコネクションを監視するスレッドがWebアプリケーション停止後も停止せず残ってしまう問題についてもcloseMethodのサポートにより解決できます。
今までばらばらだった全てのコネクタ(HTTP、AJP(Apache Jserv Protocol)、APR(Apache Portable Runtime ))の実装を同じコードベースで再実装しました。
リクエスト処理スレッドのプーリングをTomcat独自の「org.apache.tomcat.util.threads.ThreadPool」から「java.util.concurrent.Executor」ベースの実装に変更しました。このコネクタのリファクタリングにより、maxSpareThreadsの設定は使用されなくなりました。
また、Tomcat 6以前では、Apacheと連携時に利用するAJPコネクタでは、maxThreadsのうち1スレッドのアクセプタ用のスレッドとして利用していたため、実際にリクエスト処理に利用できるスレッドの最大数はmaxThreads-1となっていたような制約もなくなりました。
Tomcat 7は「CSRF(Cross Site Request Forgeries)」攻撃を防止する「org.apache.catalina.filters.CsrfPreventionFilter」を提供します(参考:Apache Tomcat 7 Configuration Reference (7.0.16) - Container Provided Filters)。
Tomcat 7は、Tomcat版「mod_expires」といえる「org.apache.catalina.filters.ExpiresFilter」を提供します(参考:Apache Tomcat 7 Configuration Reference (7.0.16) - Container Provided Filters)。
Tomcat 7は長時間処理しているリクエストを検知する「org.apache.catalina.valves.StuckThreadDetectionValve」を提供します(参考:Apache Tomcat 7 Configuration Reference (7.0.16) - The Valve Component)。
Tomcat 7はWebクローラによるセッションの大量生成を防止する「org.apache.catalina.valves.CrawlerSessionManagerValve」を提供します(参考:Apache Tomcat 7 Configuration Reference (7.0.16) - The Valve Component)。
TomcatのWebAppクラスローダに仮想クラスパスの追加を可能にした仮想クラスローダ機能を追加しました(参考:Apache Tomcat 7 Configuration Reference (7.0.16) - The Loader Component)。
Tomcatのロギング機能であるJULIに、「AsyncFileHandler」「OneLineFormatter」「VerbatimFormatter」などの新クラスが追加されました。
ライフサイクルアーキテクチャがリファクタリングされました。これによりTomcatの内部コンポーネントの起動状態がより明確に管理されるようになりました。
普通に利用する分にはあまり意識することはありませんが、非常に大きなリファクタリングです。
アクセスログがデフォルトで有効になりました。
また、従来のバージョンではコンテナ(Engine、Host、Context)でのみアクセスログの出力を行っていたが、Tomcat 7ではコンテナに到達しないような不正なリクエストもAccessログに出力できるようになりました(Tomcat 6にバックポート済み、参考:Apache Tomcat 7 Configuration Reference (7.0.16) - The Valve Component)。
セッション固定攻撃対策として、認証の前後でセッションIDが変更されるようになりました。
Tomcat 6、5にバックポート済みでTomcat 6ではデフォルト有効、Tomcat 5.5ではデフォルト無効です。
ただし注意しておきたいのは、このセッション固定攻撃の対策ではセッションIDのみを変更することです。このため、セッション生成時とセッション破棄時のセッションIDが異なることになります。
javax.servlet.http.HttpSessionListenerなどでセッションの生成と破棄を監視している場合は注意が必要です。Tomcat 7では、セッションIDの変更をorg.apache.catalina.ContainerListenerに通知しています。
もし、セッションIDの変更を検知したい場合は、ContainerListenerを実装する必要があります。
セッションアクセス時間をより仕様に準拠させるシステムプロパティが追加されました(参考:Apache Tomcat 7 Configuration Reference (7.0.16) - System Properties)。
いくつかのValveがServletAPIのFilterに書き換えられました(参考:Apache Tomcat 7 Configuration Reference (7.0.16) - Container Provided Filters)。
Webアプリケーション内の「/META-INF/context.xml」を「conf/Catalina/localhost」にコピーする機能がオプショナルになりました。
デフォルトでは、コピーしないので「conf/Catalina/localhost」にコンテキストのXMLが配置されません。
本連載ではTomcat 7の主な変更点として、Servlet 3.0とTomcat 7の新機能を紹介しました。ざっくりとした紹介ではありましたが、Tomcat 7の実力と魅力を感じていただければ幸いです。
現在Tomcatを利用している方、今後利用を検討している方は、ぜひTomcat 7の導入を検討してみてはいかがでしょうか?
Copyright © ITmedia, Inc. All Rights Reserved.