Open5
(Spring)Filterとは?
FIlterとは?
->インターセプターより手前(または後ろ)で行われる処理
Filterは、サーブレットの実行前または実行後に呼び出すことができます。
出典:What Is OncePerRequestFilter? | Baeldung
OncePerRequestFilterとは?
->リクエストの際に一度だけ行われるフィルター処理
Springは、指定されたリクエストに対してOncePerRequestFilterが 1 回だけ実行されることを保証します。
出典:What Is OncePerRequestFilter? | Baeldung
参考
実装の流れ
-
filter
用のパッケージを作る -
OncePerRequestFilter
クラスを継承した認証クラスを作る - 上記で作成した認証クラスの中で認証処理を記述する。
- 完成した認証クラスを
WebMvcConfig
に登録する- この流れはインターセプターと同様。こちらはDIするだけで済んだ。
-
@Bean
を付与してコンストラクタを作成した。
->こちらのやり方だと全てのパスにフィルターがセットされてしまった。
->次の構成で実装することでフィルタリングを実行するパスを指定できた。
実装の流れ(フィルタリング対象パスを指定する場合)
- 上記1~3までは同様
- 完成した
認証クラス
をWebMvcConfig
に登録する -
@Bean
を付与して、FilterRegistrationBean
インスタンスを戻り値にもつメソッドを生成する - その中で
FilterRegistrationBean
インスタンスを生成し、引数に認証クラス
のインスタンスを入れる -
FilterRegistrationBean
のメソッドであるaddUrlPatterns
により対象のパスを指定する。 - 戻り値としてインスタンスを返す。
実装イメージ
@Configuration
public class MyConfig implements WebMvcConfigurer {
@Bean
public FilterRegistrationBean filterRegister() {
FilterRegistrationBean bean = new FilterRegistrationBean(new MyAuthenticationFilter());
bean.addUrlPatterns("/api/*");
return bean;
}
}
認証クラスをMyAuthenticationFilter
として、
apiのURLにのみフィルターをかけているイメージ。
参考
参考ドキュメント等
-
OncePerRequestFilter (Spring Framework API) - Javadoc
- リクエストに対して一度処理を行うフィルター。
- このクラスを継承して認証処理を記述する。
-
WebMvcConfigurer (Spring Framework API) - Javadoc
- 作成したフィルターをここに登録する
-
FilterRegistrationBean (Spring Boot API) - Javadoc
- 上記コンフィグクラス内でフィルター処理を登録する
Filterの構造のイメージ
public class CommonsRequestLoggingFilter {
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
// filterChain.dofilterより上の処理
// ->コントローラより前に実行される
filterChain.doFilter(request, response);
// filterChain.dofilterより下の処理
// ->コントローラより後に実行される
}
}