サーブレットフィルターは、サーブレットやJSP(Springではコントローラー)において「共通の前後処理を記述するための仕組み」のことを指す。
javax.servlet.Filter
を実装して作成する。
フィルタークラスの実装
Filterインターセプターには3つのメソッドがあるが、必ず実装しなければならないのはdoFilterメソッドのみで残りの2つのメソッドは必要な場合に実装する。
メソッド名 | 説明 |
---|---|
init | 最初に1回のみ実行されるメソッド。フィルターの初期化処理などが必要な場合に実装する。 |
doFilter | フィルターで行いたい処理を記述する |
destroy | 最後に1回のみ実行されるメソッド。フィルターの終了処理などが必要な場合に実装する。 |
doFilterメソッドの中で chain.doFilter(request, response); を必ず呼び出す。
このメソッドは後続のフィルター(フィルターがない場合はサーブレット)を呼び出している。
このメソッドを境に、これより上に書かれている処理はサーブレットの処理前、下に書かれている処理はサーブレットの処理後に実行される。
public class LoggingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init!!"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Before!!"); chain.doFilter(request, response); System.out.println("After!!"); } @Override public void destroy() { System.out.println("destroy!!"); } }
フィルターの設定
フィルターの設定はConfigurationクラスで行う。
setOrder(int)でフィルターの実行順序を設定することができる。設定する数字は負数でも可。値が小さい順にFilterの順序付けがされる。
順序を指定しなかった場合は、順序は不定となる。
@Configuration public class SampleConfig { // フィルターをDIコンテナに登録する @Bean public Filter sampleFilter() { return new SampleFilter(); } // フィルターをDIコンテナに登録する @Bean public Filter sampleFilter2() { return new SampleFilter2(); } @Bean public FilterRegistrationBean<Filter> sampleFilter10(Filter sampleFilter) { FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<Filter>(sampleFilter); // フィルターの適用URLを設定する bean.addUrlPatterns("/*"); // フィルターの実行順序を設定する bean.setOrder(2); return bean; } @Bean public FilterRegistrationBean<Filter> sampleFilter20(Filter sampleFilter2) { FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<Filter>(sampleFilter2); // フィルターの適用URLを設定する bean.addUrlPatterns("/hoge"); // フィルターの実行順序を設定する bean.setOrder(1); return bean; } }