Spring Bootフィルターを定義する方法は?
1. 概要
このクイックチュートリアルでは、Spring Bootを使用して、カスタムフィルターを定義し、それらの呼び出し順序を指定する方法について説明します。
参考文献:
2. フィルターと呼び出し順序の定義
2つのフィルターを作成することから始めましょう:
-
TransactionFilter –トランザクションを開始およびコミットします
-
RequestResponseLoggingFilter –要求と応答をログに記録する
フィルタを作成するには、Filterインターフェイスを実装するだけです。
@Component
@Order(1)
public class TransactionFilter implements Filter {
@Override
public void doFilter
ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
LOG.info(
"Starting a transaction for req : {}",
req.getRequestURI());
chain.doFilter(request, response);
LOG.info(
"Committing a transaction for req : {}",
req.getRequestURI());
}
// other methods
}
@Component
@Order(2)
public class RequestResponseLoggingFilter implements Filter {
@Override
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
LOG.info(
"Logging Request {} : {}", req.getMethod(),
req.getRequestURI());
chain.doFilter(request, response);
LOG.info(
"Logging Response :{}",
res.getContentType());
}
// other methods
}
Springがフィルターを認識できるようにするには、フィルターを@Componentアノテーション付きのBeanとして定義する必要がありました。
また、フィルターを正しい順序で実行するには、@Orderアノテーションを使用する必要がありました。
2.1. URLパターンでフィルタリング
上記の例では、フィルターはアプリケーション内のすべてのURLに対してデフォルトで登録されています。 ただし、特定のURLパターンにのみフィルターを適用したい場合があります。
この場合、フィルタークラス定義から@Componentアノテーションを削除し、register the filter using a*FilterRegistrationBean*:を削除する必要があります。
@Bean
public FilterRegistrationBean loggingFilter(){
FilterRegistrationBean registrationBean
= new FilterRegistrationBean<>();
registrationBean.setFilter(new RequestResponseLoggingFilter());
registrationBean.addUrlPatterns("/users/*");
return registrationBean;
}
これで、フィルターは/users/*パターンに一致するパスにのみ適用されます。
フィルタのURLパターンを設定するには、addUrlPatterns()またはsetUrlPatterns()メソッドを使用できます。
3. 簡単な例
次に、簡単なエンドポイントを作成して、HTTPリクエストを送信します。
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping()
public List getAllUsers() {
// ...
}
}
このAPIにアクセスする際のアプリケーションログは次のとおりです。
23:54:38 INFO com.spring.demo.TransactionFilter - Starting Transaction for req :/users
23:54:38 INFO c.s.d.RequestResponseLoggingFilter - Logging Request GET : /users
...
23:54:38 INFO c.s.d.RequestResponseLoggingFilter - Logging Response :application/json;charset=UTF-8
23:54:38 INFO com.spring.demo.TransactionFilter - Committing Transaction for req :/users
これにより、フィルターが目的の順序で呼び出されることが確認されます。
4. 結論
この記事では、Spring BootWebアプリでカスタムフィルターを定義する方法を要約しました。
いつものように、コードスニペットはover on GitHubで見つけることができます。