Spring Bootでのサーブレットフィルタ設定

spring
この記事は約6分で読めます。

引き続きSpring Bootに関する投稿です。今回は、Spring Bootでサーブレットフィルタを設定するにはどうするか?、です。

環境

  • spring-boot-2.0.4.RELEASE
  • spring-boot-starter-web
  • Embedded Tomcat 8.5.32

組み込みのTomcatコンテナで動作させる前提です。

フィルタの登録方法

Spring Bootでは、web.xmlのような設定ファイルは不要で、コントローラやフィルタなどのクラスを実装し、アノテーションやBean定義を行なうだけで、容易にSpring Bootに追加したい機能(今回はフィルタ)を認識させることができます。

さて、Spring Bootでフィルタを登録する方法ですが、1〜3で利用頻度もしくは一般的であろう順(著者感覚)に整理してみました。

1. FilterRegistrationBeanのBean定義

Spring Bootでは、Servlet、Filter、Listenerに対し、それぞれServletRegistrationBeanFilterRegistrationBeanServletListenerRegistrationBeanというInitializerクラスが用意されています。

これらのクラス群は、ServletContextInitializerインタフェースを実装しており、ServletContextの初期化時に呼ばれ、各種コンフィグレーションを行なうようになっています。そして、各種BeanはServletContextInitializerBeansコンテナ(ここではコレクションのデータコンテナを意味する)に登録されており、TomcatStarteronStartupコールバックでコンフィグレーションが実行されます。

MyFilter、MyFilter2クラスは、通常のフィルタ定義と同様で、javax.servlet.Filterインターフェースを実装したクラスとして定義します。

参考 

2. FilterのBean定義

Servlet3.0で@WebFilterでフィルタ定義ができるようになりました。通常Spring Bootで組み込みコンテナを使って起動した場合、この@WebFilter定義は無視されます。しかし、これらのアノテーションを使ったクラス(ライブラリなど)をアプリケーションでもそのまま利用したい場合、@ServletComponentScanをつけると認識してくれるようです。

@ServletComponentScanを付与した場合、ServletComponentHandlerを継承している各種HandlerクラスであるWebFilterHandlerWebListenerHandlerWebServletHandlerで処理されます。@ServletComponentScanには、スキャンのベースとなるパッケージを指定します。@ServletComponentScanの指定がない場合は、アノテーションが指定されたクラスのパッケージからスキャンされます。

フィルタクラスに@WebFilterを指定します。

参考 

3. ServletContextInitializerのBean定義

フィルタ以外にもServletContextの初期化時に何らかの処理をしたい場合には、独自のServletContextInitializerを定義することができます。この場合1と同様、ServletContextInitializerBeansに登録され、コンテナ起動時にスタートアップコールバックが呼ばれます。コールバックの引数で、ServletContextオブジェクトが渡されるので、その中で必要な設定を行なう方法も可能だと思います。

以下は直接Servlet APIを呼んで、InitParameterやFilterを登録する例です。

参考 

参考リンク

コメント

タイトルとURLをコピーしました