JAX-RS(Jersey) Filterを使う前に

システムの都合上、認証・認可で標準的手法(Basic, Form, Digest, etc...)が使えない。
そんなわけでフィルタを使ってゴニョゴニョすることになるが、実際に使う前に関連情報を整理。

参考
Chapter 10. Filters and Interceptors
JAX-RS 2.0 ことはじめ - Programming Studio
JAX-RSをやってみる (9) - Container Filters - - kinjouj.github.io

FilterとInterceptor

どちらもリソースの呼び出し前後に処理を注入できる。
サーバー側・クライアント側に分けられるが、とりあえず使うサーバー側のみ整理。

  • Filter

    • Request, ResponseそれぞれのFilterがある
    • 主にHTTPヘッダーなどの要求・応答パラメータの操作で使用する
  • Interceptor

    • ReaderInterceptor, WriterInterceptorの2種類
    • 主にHTTPボディなどの入出力ストリームの操作で使用する
    • 順序としてはFilterの後に呼び出される

@PreMatching

  • サーバー側Requestフィルタに使用する
  • リソースクラス・メソッドの呼び出しが決定(Match)される前に処理される
  • @PreMatchingを付けなければPostMatching(呼び出し決定後のフィルタ処理)
  • ヘッダー操作して呼び出しリソースを変更したい、という場合に使う

処理順(サーバー側のみ)

JAX-RS 2.0 ことはじめ - Programming Studio
の図が分かりやすい。厳密には@PreMatchingのサーバーリクエストフィルタが入る。

  1. ContainerRequestFilter with @PreMatching
  2. 呼び出しリソースの決定 (Matching)
  3. ContainerRequestFilter without @PreMatching
  4. ReaderInterceptor
  5. リソースメソッド実行
  6. ContainerResponseFilter
  7. WriterInterceptor

というわけで、認可処理をゴニョゴニョするのであればContainerRequestFilterを使うことになりそう。