SpringBootでのインターセプターに関して
SpringBootでのインターセプターですが、
Spring MVCでのリクエストに対してのアクセスコントロールや認証などの共通処理を
実装する方法は、HandlerInterceptorを利用すると実現可能です。
これは、SpringBootでも同じですので、以前のエントリーの方法で実装は、同じです。chronosdeveloper.hatenablog.com
しかし、SpringBootだと作成したインターセプターをConfigurationのクラス内で、
登録する設定ロジックを記述してもうまく動作しない?addInterceptorsメソッドが呼ばれないようです。
@Configuration public class WebApplicationConfiguration extends WebMvcConfigurationSupport { @Bean public SampleHandlerInterceptor sampleHandlerInterceptor() { return new SampleHandlerInterceptor(); } /** * {@inheritDoc} */ @Override protected void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(sampleHandlerInterceptor()).addPathPatterns("/**") }
次に確認したのは、WebMvcConfigurerAdapterを継承して、Configurationのクラスを作成。
作成したインターセプターをConfigurationのクラス内で、登録する設定ロジックを記述...
SpringBootを起動したが、これもaddInterceptorsメソッドが呼ばれない。
@Configuration public class WebApplicationConfiguration extends WebMvcConfigurerAdapter { @Bean public SampleHandlerInterceptor sampleHandlerInterceptor() { return new SampleHandlerInterceptor(); } /** * {@inheritDoc} */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(sampleHandlerInterceptor()).addPathPatterns("/**") }
それで、いろいろ調べてみたら、SpringBootのドキュメントに下記の記述が!!
Spring Boot MVCの機能を維持し、インターセプタ、フォーマット、ビュー・コントローラなどの
追加設定を行う場合は、@EnableWebMvcを使用せず、WebMvcConfigurerAdapterの
@Beanクラスを定義してくださいって書いてある!!
@Configuration public class WebApplicationConfiguration { @Bean public SampleHandlerInterceptor sampleHandlerInterceptor() { return new SampleHandlerInterceptor(); } @Bean public WebMvcConfigurerAdapter webMvcConfigurerAdapter() { return new WebMvcConfigurerAdapter() { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(sampleHandlerInterceptor()).addPathPatterns("/**"); } }; }
これも駄目だった...。
まじかwww。
applicationContext.xmlのxsdファイルを見て、MappedInterceptorを使っいるぽい?
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
Configurationのクラス内で、MappedInterceptorのBeanを定義します。
@Bean public MappedInterceptor interceptor() { return new MappedInterceptor(new String[]{"/**"}, sampleHandlerInterceptor()); }
このやり方ならインターセプターの登録をすることが可能で、
実際SpringBootを起動して、インターセプターがちゃんと動作することが確認できました。