読者です 読者をやめる 読者になる 読者になる

Spring Boot で複数の Filter を定義する

java

例えば下記のように @Bean アノテーションを複数書くことによって複数のフィルタを追加できる。

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Bean
    public Filter filter() {
        return new SomeServletFilter();
    }

    @Bean
    public Filter filter2() {
        return new SomeServletFilter2();
    }
}

また、おそらく上記の書き方では上から順番にフィルタが追加されるが、フィルタの登録順を決めてしまいたい場合は下記のように FilterRegistrationBean の setOrder() を用いる。

    @Bean
    public FilterRegistrationBean filter() {
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new SomeServletFilter());
        bean.setOrder(2); // 数字が大きいほうが後に呼ばれる
        return bean;
    }

    @Bean
    public FilterRegistrationBean filter2() {
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new SomeServletFilter2());
        bean.setOrder(1); // 数字が小さいほうが先に呼ばれる
        return bean;
    }

他にも Configuring boot servlet context and filters | Level Up Lunch などによると何かしらの初期化時に ServletContext に addFilter() すればよいらしいがうまく行かなかったのでここでは割愛する。

2016/08/05 追記

これらの設定はおそらく Spring Boot は関係なくて Spring Framework の DI の設定らしい。 Spring のコードはちゃんと読んでないけど、おそらく Spring 側の Autowired 時に同じ型のものが複数定義されていた場合に取得する方法( List のような形)で使われているような気がする。

参考文献

Configuring boot servlet context and filters | Level Up Lunch

Convert an existing application to Spring Boot - Spring Boot Reference Guide