Spring Bootでサーブレットフィルターを作成する

サーブレットフィルターは、サーブレット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;
    }
}