Spring BootでFilterする方法 ホームページ制作 | 墨田区

Spring BootでFilterする方法

LINEで送る
Pocket

Spring BootでFilterを実装する方法のご紹介です。
Spring BootでFilterする方法

Spring Boot では web.xml がありません。では、どうやったら Filter を実装できるのか・・・その方法をご紹介します。複数 Filter する方法も掲載しておきます。

これから Spring BootでWebアプリを開発しようという方 のお役に立てればうれしいです。




【PR】マジか?!「アレ」してるLINEスタンプっていったい・・・


環境

Spring Boot 1.4.1
Thymeleaf 3.0.2
Windows7
Java8
Eclipse 4.6 Neon

こちらのページを参考にサンプルアプリを作ってください。既に何がしかのアプリがある場合は、読み飛ばして結構です。
Spring Bootを使ってWebアプリを作る方法

Spring BootでFilterを実装する

Filter インターフェースの実装クラスを作ってコンテナ登録します。
package springbootapp;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.springframework.stereotype.Component;

@Component
public class LoggingFilter implements Filter {
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    System.out.println("[Spring BootでFilterを実装] : init");
  }
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  throws IOException, ServletException {
    System.out.println("[Spring BootでFilterを実装] : doFilter");
    chain.doFilter(request, response);
  }
  @Override
  public void destroy() {
    System.out.println("[Spring BootでFilterを実装] : destroy");
  }
}

構成はこんな感じです。
Spring BootでFilter実装

実行してログをみてみると・・・
2016-11-17 13:03:32.012  INFO 8592 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2016-11-17 13:03:32.016  INFO 8592 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2016-11-17 13:03:32.017  INFO 8592 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2016-11-17 13:03:32.017  INFO 8592 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2016-11-17 13:03:32.017  INFO 8592 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2016-11-17 13:03:32.017  INFO 8592 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'loggingFilter' to: [/*]
[Spring BootでFilterを実装] : init
・・・省略・・・
[Spring BootでFilterを実装] : doFilter

おおお、フィルターされましたねー^^

上記のログから、お馴染みの CharacterEncodingFilter が設定しなくても動いているがわかります。これは HttpEncodingAutoConfiguration によって自動登録されるため、デフォルトエンコーディングとして設定されている「UTF-8」を使う場合は設定する必要がありません。簡単だなー^^

Spring BootでFilterを複数実装する

上で作った LoggingFilter を LoggingFilter1 に名前を変え、LoggingFilter2 としてコピーします。実行順わかりやすいように sysout に「その1」とか「その2」とか付けておきます。

@Component アノテーションは削除しておきます。
package springbootapp;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class LoggingFilter1 implements Filter {
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    System.out.println("[Spring BootでFilterを実装 その1] : init");
  }
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  throws IOException, ServletException {
    System.out.println("[Spring BootでFilterを実装 その1] : doFilter");
    chain.doFilter(request, response);
  }
  @Override
  public void destroy() {
    System.out.println("[Spring BootでFilterを実装 その1] : destroy");
  }
}

package springbootapp;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class LoggingFilter2 implements Filter {
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    System.out.println("[Spring BootでFilterを実装 その2] : init");
  }
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  throws IOException, ServletException {
    System.out.println("[Spring BootでFilterを実装 その2] : doFilter");
    chain.doFilter(request, response);
  }
  @Override
  public void destroy() {
    System.out.println("[Spring BootでFilterを実装 その2] : destroy");
  }
}

WebConfig クラスを作って、WebMvcConfigurerAdapter を extened します。メソッドに @Bean アノテーションを書くことによって、複数のフィルタを追加できます。
package springbootapp;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
  @Bean
  public FilterRegistrationBean filter1() {
    FilterRegistrationBean bean = new FilterRegistrationBean();
    bean.setFilter(new LoggingFilter1());
    bean.setOrder(2);
    return bean;
  }
  @Bean
  public FilterRegistrationBean filter2() {
    FilterRegistrationBean bean = new FilterRegistrationBean();
    bean.setFilter(new LoggingFilter2());
    bean.setOrder(1);
    return bean;
  }
}

構成はこんな感じです。
Spring Bootで複数Filter実装

実行してログをみてみると・・・
2016-11-17 13:27:03.388  INFO 6716 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2016-11-17 13:27:03.388  INFO 6716 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2016-11-17 13:27:03.389  INFO 6716 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2016-11-17 13:27:03.389  INFO 6716 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2016-11-17 13:27:03.389  INFO 6716 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'loggingFilter2' to: [/*]
2016-11-17 13:27:03.389  INFO 6716 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'loggingFilter1' to: [/*]
2016-11-17 13:27:03.389  INFO 6716 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
[Spring BootでFilterを実装 その2] : init
[Spring BootでFilterを実装 その1] : init
・・・省略・・・
[Spring BootでFilterを実装 その2] : doFilter
[Spring BootでFilterを実装 その1] : doFilter

おおお、フィルターされましたねー^^

setOrder プロパティでフィルターの登録順を設定できます。多分、メソッドを書いた順番で動くと思うんですけど、明示的にしておけば安心ですので。

まとめ

これで web.xml なしでフィルター実装できることがわかりましたね。

Servlet は 3.0 になってからアノテーションを利用することで Servlet の設定が単純になりました。一度はプログラミングの外に設定を追い出したはずなのに、アノテーションを利用することでまたプログラミングの中に記述するスタイルに戻った・・・ということですかね。さて、どっちがメリット高いのか・・。設定は外出ししておいた方がメンテナンス性は向上しそうだけど、生産性はどうなんだって・・・。永遠のテーマなんでしょうかねー^^;

次は開発と本番で設定ファイルを切り替えるあたりを検証しましょうかね。
Spring Bootで設定ファイル(yaml)を読み込む方法

おすすめ書籍 – 私はこの書籍1冊で Spring Boot を習得できました^^

SpringBootプログラミング入門

新品価格
¥3,024から



おつかれさまでした。

LINEで送る
Pocket

この記事がお役に立ちましたら シェア をお願いいたします。

Javaの勉強が思うように進まないときは!

Javaの勉強が思うように進まないのであれば、プロに直接質問ができる プログラミングスクール を検討してみてはいかがでしょうか?プログラミングスクールに申し込めば、短期間で一定のスキルを身に着けることができます!

Javaコースあり!オンライン完結型 テックアカデミー TechAcademy [テックアカデミー]

どこかに通う必要なく、自宅でプログラミングやアプリ開発を学ぶことができるのが特徴のスクールです。未経験からプロになるまで最短4週間という、超短期集中型の学習ができます。年齢層は10代〜40代の男女が中心で、学引があり多くの学生が受講しているそうですよ。オンラインで受講ができるスクールですので、全国どこからでも学習ができますね。

更にさらに、パーソナルメンターにチャット質問できちゃうんです!!

これは素晴らしいことですよ!ハマったり困ったことが起こるのがプログラミングの世界。知っている誰かに聞けば数分で解決することが、自分だけだと何時間もかかったりしますから!いや、これホントですよ。

しかし、便利な世の中になりましたよねー。一昔前ではオンラインで学習できるなんて、思いもよりませんでしたから。講師もバリバリのエンジニアですので、現場で使えるスキルを教えてもらえます。なんとも素晴らしいスクールがあったものですね。学割を使えば社会人より半額以下で受講できますから、学生さんには超おすすめです。

これから Java プログラミングを勉強して、将来はプログラマーとして活躍したいと思っている方には、就職保証付きJavaエンジニアコース というのがおすすめです。就職先まで保証してくれるとなれば、もう安心して学習に専念できますね。夢への第一歩はここから始まるのかも。あ、将来はライバルですね^^

オンラインスクールですから営業エリアは全国です。
気になる方は一度チェックしてみてください。無料の動画説明会も常時開催していますよ。


Javaコースあり!未経験者にウケてる KENスクール パソコンスクール・パソコン教室 【KENスクール】個別指導のWeb-DTP・OA・IT PCスクール

理解度や学習ペースに合わせて、一人ひとりが納得して前進できる授業を提供してくれるのが特徴です。特に課題製作は現場さながらで、実務に即したものとなっていますので短期でのスキルアップが望めます。自宅学習のサポートも充実していて、授業内容をいつでもビデオで振り返ることができるのもうれしいですね。好きな時間に好きな場所で、無理なくスケジューリングできるので、仕事の忙しい方でも柔軟に学ぶことができますよ。

更にさらに、なんと 就職サポート をしてくれるというのですから驚きです!!

履歴書の書き方から面接指導、求人の紹介など、具体的な就職先まで提案してくれるんです!私も「もっと早く出会いたかったなぁー、こんなスクール」・・・って思っちゃいました^^

東京・神奈川・愛知・大阪を営業エリアとされています。
まずは気軽に 無料体験予約 に申し込んでみるのもアリですよ。


コメントを残す

お名前 (必須)
メールアドレス
(アドレスは公開されません)

コメント(必須)

Trackback URL