連載
» 2011年06月24日 00時00分 公開

技術者が知っておきたいTomcat 7の新機能20連発Tomcat 7の新機能で何ができるようになるのか?(3)(3/3 ページ)

[藤野圭一,NTT OSSセンタ]
前のページへ 1|2|3       

【6】Apacheと同様なエイリアス(aliases)をサポート

 TomcatはコンテキストごとのdocBase配下(デフォルトでは「webapps/コンテキスト名」)のリソースを参照します。Tomcat 7から採用されたaliases機能を利用すると、任意のディレクトリにあるHTML画像などの静的なリソースがdocBaseの配下に配置されているように見せかけることが可能になります。要するに、Apache HTTP Serverの「Alias」と同じような機能です。

 以下のようにContextにaliases属性を設定すると、「http://【ホスト】/【コンテキスト】/aliasPath1/【xxx】」で該当リソースxxxにリクエスト可能になります。

<Context aliases="/aliasPath1=docBase1,/aliasPath2=docBase2"  />

【7】JNDIリソースのクローズ処理サポート

 <Resource>のcloseMethod属性(デフォルト未設定)を設定することで、Webアプリケーションの停止時にcloseMethod属性を設定したリソースに対してクローズ処理を呼び出せます。

 例えば、Apache Commonsの「DBCP」「jdbc-pool」をJNDIリソースとして登録した場合、DBCPやjdbc-poolのjavax.sql.DataSource実装クラスはcloseメソッドを提供しているため、<Resource>のcloseMethod属性に「close」と設定することで、そのWebアプリケーションの停止時にデータベースコネクションプールをクリアできます。

 また、timeBetweenEvictionRunsMillisを設定することによって起動するコネクションを監視するスレッドがWebアプリケーション停止後も停止せず残ってしまう問題についてもcloseMethodのサポートにより解決できます。

【8】コネクタ実装の統一

 今までばらばらだった全てのコネクタ(HTTPAJP(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となっていたような制約もなくなりました。

【9】CSRFを防止するフィルタ

 Tomcat 7は「CSRF(Cross Site Request Forgeries)」攻撃を防止する「org.apache.catalina.filters.CsrfPreventionFilter」を提供します(参考:Apache Tomcat 7 Configuration Reference (7.0.16) - Container Provided Filters)。

【10】Tomcat版「mod_expires」でキャッシュの有効利用

 Tomcat 7は、Tomcat版「mod_expires」といえる「org.apache.catalina.filters.ExpiresFilter」を提供します(参考:Apache Tomcat 7 Configuration Reference (7.0.16) - Container Provided Filters)。

【11】長時間処理しているリクエストを検知

 Tomcat 7は長時間処理しているリクエストを検知する「org.apache.catalina.valves.StuckThreadDetectionValve」を提供します(参考:Apache Tomcat 7 Configuration Reference (7.0.16) - The Valve Component)。

【12】Webクローラによるセッション大量生成を防止

 Tomcat 7はWebクローラによるセッションの大量生成を防止する「org.apache.catalina.valves.CrawlerSessionManagerValve」を提供します(参考:Apache Tomcat 7 Configuration Reference (7.0.16) - The Valve Component)。

【13】仮想クラスローダ機能

 TomcatのWebAppクラスローダに仮想クラスパスの追加を可能にした仮想クラスローダ機能を追加しました(参考:Apache Tomcat 7 Configuration Reference (7.0.16) - The Loader Component)。

【14】Tomcatのロギング機能に新クラスが追加

 Tomcatのロギング機能であるJULIに、「AsyncFileHandler」「OneLineFormatter」「VerbatimFormatter」などの新クラスが追加されました。

【15】ライフサイクルアーキテクチャの変更

 ライフサイクルアーキテクチャがリファクタリングされました。これによりTomcatの内部コンポーネントの起動状態がより明確に管理されるようになりました。

 普通に利用する分にはあまり意識することはありませんが、非常に大きなリファクタリングです。

【16】アクセスログの機能追加

 アクセスログがデフォルトで有効になりました。

 また、従来のバージョンではコンテナ(Engine、Host、Context)でのみアクセスログの出力を行っていたが、Tomcat 7ではコンテナに到達しないような不正なリクエストもAccessログに出力できるようになりました(Tomcat 6にバックポート済み、参考:Apache Tomcat 7 Configuration Reference (7.0.16) - The Valve Component)。

【17】セッション固定攻撃対策

 セッション固定攻撃対策として、認証の前後でセッションIDが変更されるようになりました。

 Tomcat 6、5にバックポート済みでTomcat 6ではデフォルト有効、Tomcat 5.5ではデフォルト無効です。

 ただし注意しておきたいのは、このセッション固定攻撃の対策ではセッションIDのみを変更することです。このため、セッション生成時とセッション破棄時のセッションIDが異なることになります。

 javax.servlet.http.HttpSessionListenerなどでセッションの生成と破棄を監視している場合は注意が必要です。Tomcat 7では、セッションIDの変更をorg.apache.catalina.ContainerListenerに通知しています。

 もし、セッションIDの変更を検知したい場合は、ContainerListenerを実装する必要があります。

【18】セッションアクセス時間の仕様準拠

 セッションアクセス時間をより仕様に準拠させるシステムプロパティが追加されました(参考:Apache Tomcat 7 Configuration Reference (7.0.16) - System Properties)。

【19】ValveからFilterへの移行

 いくつかのValveがServletAPIのFilterに書き換えられました(参考:Apache Tomcat 7 Configuration Reference (7.0.16) - Container Provided Filters)。

【20】「META-INF/context.xml」のコピー

 Webアプリケーション内の「/META-INF/context.xml」を「conf/Catalina/localhost」にコピーする機能がオプショナルになりました。

 デフォルトでは、コピーしないので「conf/Catalina/localhost」にコンテキストのXMLが配置されません。

Tomcat 7の実力と魅力

 本連載ではTomcat 7の主な変更点として、Servlet 3.0とTomcat 7の新機能を紹介しました。ざっくりとした紹介ではありましたが、Tomcat 7の実力と魅力を感じていただければ幸いです。

 現在Tomcatを利用している方、今後利用を検討している方は、ぜひTomcat 7の導入を検討してみてはいかがでしょうか?


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。