Spring Boot 基本

Spring BootでFilterを利用してみた

前回、このブログで「AOP(Aspect Oriented Programming)」について述べていたが、AOPと同じように複数のプログラムに共通する処理を集約する仕組みとして、「サーブレットフィルタ」がある。

AOPでは、特定のJavaメソッドの実行前後に共通する処理を記載していたが、今回の「サーブレットフィルタ」では、フィルタ対象となるコントローラや静的コンテンツをURLパターンで指定することで、これらにアクセスする前後に、共通する処理を集約することができる。

静的コンテンツもフィルタ指定対象にできることが、AOPの場合とは大きく異なっている。フィルタ・AOPが動作する位置については、下記サイトの「共通処理の実装方法」に記載された図が参考になる。
https://qiita.com/kazuki43zoo/items/757b557c05f548c6c5db

今回は、処理の前後にログ出力するサンプルプログラムを通して、「サーブレットフィルタ」の具体的な実装方法について共有する。

前提条件

以下の記事のSpring BootのWEB画面用アプリが作成済であること。

IntelliJ IDEA上でGradleを使ってWeb画面のSpring Bootプロジェクトを作成してみたSpring Bootのプロジェクトを新規作成を「IntelliJ IDEA」のメニューから実施しようとしたところ、無料の「Commun...

 

やってみたこと

  1. ログ出力定義の追加
  2. フィルタ定義クラスの作成
  3. 定義ファイルへのフィルタ登録と動作検証

 

ログ出力定義の追加

今回はフィルタを利用したログ出力を行うため、Spring BootによるWEB画面作成時に配置されている「application.properties」に、ログ出力定義を追加する。追加後のapplication.propertiesは以下の通り。

上記のうち、下3行がログ出力定義となる。この定義により、demoアプリケーションについてはデバッグレベルのログが、「C:/work/logs/demo.log」というファイルに出力されることになる。

また、今回作成したプログラムの構成は以下の通り。
filter1のプログラム構成

なお、「DemoConfig.java」は、Spring Boot起動時にフィルタオブジェクトを生成する設定を行うクラスで、「DemoFilter1.java」「DemoFilter2.java」はフィルタ定義を行うクラスとなる。その内容については後述する。

フィルタ定義クラスの追加

今回は、2種類のフィルタをサンプルプログラムに追加した。それぞれのフィルタ定義クラスの内容は以下の通りで、Filterインタフェースをimplementsしている。それぞれ、処理の前後にログ出力するようにしている。

定義ファイルへのフィルタ登録と動作検証

先ほど作成した2種類のフィルタを、「@Configuration」アノテーションをもつ定義ファイルにFilterRegistrationBeanオブジェクトとして追加し、Spring Boot起動時にフィルタオブジェクトが生成されるようにした。そのプログラムの内容は以下の通り。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-filter1/demo

その後、Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスした結果は以下の通り。
Filterを利用したプログラム1の実行結果

また、その際のコンソール・ログ出力結果は以下の通りで、下図赤枠部分で、画面遷移時のコントローラ「DemoController.java」呼び出しにより、「DemoFilter1.java」「DemoFilter2.java」で記載したログが出力されているのが確認できる。

●コンソール
filterを利用したプログラム1のコンソール出力結果

●ログファイル(C:/work/logs/demo.log)
filterを利用したプログラムのログ出力結果

要点まとめ

  • 「サーブレットフィルタ」を利用すると、特定の静的コンテンツやコントローラに対して、複数のプログラムに共通する処理を集約することができる。
  • フィルタクラスは、Filterインタフェースをimplementsすることで作成できる。「chain.doFilter(request, response);」の前後に、集約したい共通処理を実装すればよい。
  • Spring Boot起動時にフィルタオブジェクトが生成されるようにするには、クラスの先頭に「@Configuration」アノテーションを付与した定義ファイルに、FilterRegistrationBeanオブジェクトを追加すればよい。その際のフィルタの実行順序は、setOrderメソッドで設定する。