home >  Apache > Tomcat

Tomcat5.5で全アプリに適用されるFilterを作ってみる

タグ:

全アプリケーションで共通のFilterを作る。これはサーバ全体で同じFilterが動作するということになる。

Tomcatのクラスローダなどがでてきて結構大変だった。


Filterを作る

これは普通に作ればいい。javax.servlet.Filterをextendsして作った。

public class CommonFilter implements Filter {

public void destroy() {
// TODO 自動生成されたメソッド・スタブ

}

public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {

System.out.println("[DEBUG]doFilter start");
System.out.println("[DEBUG]doFilter execute");
System.out.println("[DEBUG]doFilter end");

arg2.doFilter(arg0, arg1);
}

public void init(FilterConfig arg0) throws ServletException {

 System.out.println("[DEBUG]doFilter init " + arg0.getServletContext().getServletContextName());

}
}

web.xmlに定義する

TOMCAT_HOME/conf/web.xmlにアプリケーション全体で使われるサーブレットやFilterの定義ができる。ssiのFilter近くに以下の記述を追加。

<filter>
<filter-name>CommonFilter</filter-name>
<filter-class>
testapp.CommonFilter
</filter-class>
</filter>

<filter-mapping>
<filter-name>CommonFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

jarファイルを配置する

TOMCAT_HOME/common/libに入れたら動く。


common/libに配置した場合

正常に起動した。

//stdout.log
[DEBUG]doFilter init Tomcat Manager Application
[DEBUG]doFilter init Tomcat Manager Application
[DEBUG]doFilter init Tomcat Simple Load Balancer Example App
[DEBUG]doFilter init JSP 2.0 Examples
[DEBUG]doFilter init Welcome to Tomcat
[DEBUG]doFilter init Servlet 2.4 Examples
[DEBUG]doFilter init Tomcat Documentation
[DEBUG]doFilter init Webdav Content Management

デプロイされているアプリの分だけFilterのinitが起動しているようだ。


注意点

他のフォルダにJarを配置したらどうなるかを調べてみた。Tomcat内のアプリケーションを、

  • Tomcat側(TOMCAT_HOME/server/webapps)
  • Webアプリ側(TOMCAT_HOME/webapps)

に分かれているのがよくわかった。


server/libに配置した場合

3つはうまく起動したみたいに見える。起動したWebアプリはTomcat側のものなので起動でき、それ以外はWebアプリ側なので、server/libを見ることができず、ClassNotFoudExceptionが発生する。

//catalina.log
2007/12/11 14:31:44 org.apache.catalina.core.StandardContext start
致命的: 以前のエラーのためにコンテキストの起動が失敗しました [/servlets-examples]
//stdout.log
[DEBUG]doFilter init Tomcat Manager Application
[DEBUG]doFilter init Tomcat Manager Application
[DEBUG]doFilter init Tomcat Simple Load Balancer Example App
//localhost.log
2007/12/11 14:36:50 org.apache.catalina.core.StandardContext filterStart
致命的: フィルタ CommonFilter の起動中の例外です
java.lang.ClassNotFoundException: testapp.CommonFilter
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1362)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1208)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:207)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:302)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:78)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3635)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4222)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:760)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:740)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:544)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1022)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:448)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)

shared/libに配置した場合

エラー発生。catalina.log、localhost.logはserver/libに配置したときと同じ感じ。stdout.logを見る と、server/libの場合に起動しなかったWebアプリが起動している。これらはWebアプリ側なので、shared/libを見ることができ起動 できた。

//stdout.log
[DEBUG]doFilter init JSP 2.0 Examples
[DEBUG]doFilter init Welcome to Tomcat
[DEBUG]doFilter init Servlet 2.4 Examples
[DEBUG]doFilter init Tomcat Documentation
[DEBUG]doFilter init Webdav Content Management

結果

conf/web.xmlにFilterを記述して、サーバ全体で使うFilterを定義すると、デプロイされているすべてのアプリケーションで Filterが起動する。Tomcatには「TOMCAT_HOMR/server/webapps」と「TOMCAT_HOME/webapps」に、 デフォルトでインストールされるアプリケーションがあるので、両方から読み込める場所にFilterのつまったJarファイルを配置しなければならない。

よってこれが「common/lib」にJarを配置したら成功した理由となる。

参考:TECHSCORE Tomcatのクラスローダ

参考

脱・初心者!Java・SQL・JDBC・JSP・HTML・CSS・JavaScript・Webアプリ構築のヒント満載。
最新バージョン6.0に対応した改訂版。サーブレット/JSP対応のオープンソースウェブアプリケーションサーバTomcatについて必要な情報をすべて網羅、詳細に説明... 続き
本書はJava、SQL、HTMLの基本的な知識を有している読者を対象に、初めてe‐コマースサイト開発に挑戦する時に、最低限知っておくべき技術要件を網羅した内容と... 続き
メール、携帯、RSSを駆使して理想のツールを作ろう。シンプルな掲示板から写真付きメール対応のブログまで、さまざまなニーズへのアプローチを紹介。
Tomcatアプリケーションサーバの導入から設定、動作確認にはじまり、ServletやJSP、JDBC、JNDI、Java Mailなどをふんだんに取り入れた実... 続き
TomcatはApache Jakartaプロジェクトがオープンソース形式で開発を進めているサーブレット/JSP対応のウェブアプリケーションサーバである。本書は... 続き

コメントする


画像の中に見える文字を入力してください。

Mike Cohn (著), マイク コーン (著), 安井 力 (翻訳), 角谷 信太郎 (翻訳)
採用した現在のタイトルは、見積りや計画づくりといったプロセスを、アジャイルに進めなければならないと謳っているのだ。見積りと計画づくりがアジャイルでないのに、プロジェクトがアジャイルであるということはありえない。

メアリー・ポッペンディーク (著), トム・ポッペンディーク (著), 高嶋 優子 (翻訳), 天野 勝 (翻訳), 平鍋 健児 (翻訳) 「トヨタ生産方式」を源流にする「リーン開発」をソフトウエア開発に取り入れるための具体的方法を紹介した本です。製造分野から始まったリーン活動は、その原則を理解しないままプラクティスだけを開発分野に適用しようとしても、行き詰るか失敗に終わってしまいます。本書は、リーンの7大原則を「価値」「ムダ」「スピード」「人」「知識」「品質」「パートナー」に整理し、ソフト開発現場にどうしたら効果的に適用できるかを、多くの実例を交えながら具体的に説明します。

著者:Yugui 税込 2,310 円
本書は、他言語でのプログラミング経験を持つ人を対象に、Rubyの特徴、Rubyならではの方法や慣習について解説します。これはRubyの資料を読んで実践的な学習を進めていくために必要な前提知識です。本書はRubyの基礎的な部分とメタクラスやブロック構文のような独自の概念、それらにまつわる文化を説明し、Ruby特有の考え方を知ってもらうことを目的としています。

本書は、Railsの入門からリファレンスまでをわかりやすく解説した書籍です。第1部と第2部では、Railsの背景にある概念について説明し、あっという間に簡単なオンラインストアを開発してみせます。

著者:James Shore, Shane Warden アジャイル開発は人のなせる技である。アジャイル開発を極めるためには、その時々で無数の可能性を評価して最善の方策を選択することを学ぶ必要がある。本書は、あなたがアジャイル開発の「道」を極める手助けをしたい。

daipresents!! ҂̑蕨

tWn{github tWn{Google Code