filterの書き方

filterはservletのfilterと同様に特定の処理の前後に処理を追加できます。

以下の2つのFilterのインターフェイスがあります。

javax.ws.rs.container.ContainerRequestFilter
javax.ws.rs.container.ContainerResponseFilter


ContainerRequestFilter
リクエスト時にFilterを適用させたいときに実装します。

ContainerResponseFilter
レスポンス時にFilterを適用させたいときに実装します。

サンプルとして、パフォーマンスを計測するFilterを作ってみました。
リクエストされたパスを出力し、URLパラメータも合わせ出力します。
サーバでの処理が完了してレスポンスを返すタイミングでログを出力します。

※ロガーはlog4jを使用しています。

@Priority(Priorities.AUTHENTICATION)
public class PerformanceLogFilter implements ContainerRequestFilter, ContainerResponseFilter {

	private static final Logger log = Logger.getLogger(PerformanceLogFilter.class);
	
	public void filter(ContainerRequestContext requestContext) throws IOException {
		log.info("start : [" + requestContext.getUriInfo().getPath() + "]");
		
		for (Map.Entry<String,List<String>> param : requestContext.getUriInfo().getQueryParameters().entrySet()) {
			for (String value : param.getValue()) {
				log.info("[" + requestContext.getUriInfo().getPath() + "] name : " + param.getKey() + ", value : " + value);
			}
		}
		
	}
	
	public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
			throws IOException {
		log.info("end : [" + requestContext.getUriInfo().getPath() + "]");
	}
}

@Priority(Priorities.AUTHENTICATION)とは、Filterが適用される順番を示すもので以下の5つがあります。

Priorities.AUTHENTICATION
Priorities.AUTHORIZATION
Priorities.HEADER_DECORATOR
Priorities.ENTITY_CODER
Priorities.USER

どのように適用されていくかを実験してみます。
上記のサンプルコードの「@Priority()」の値を変えて実行した結果です。

INFO AuthenticationPerformanceLogFilter - start : [/hoge/foo]
INFO AuthorizationPerformanceLogFilter - start : [/hoge/foo]
INFO HeaderDecoratorPerformanceLogFilter - start : [/hoge/foo]
INFO EntityCoderPerformanceLogFilter - start : [/hoge/foo]
INFO UserPerformanceLogFilter - start : [/hoge/foo]
INFO HogeResource - access!!
INFO UserPerformanceLogFilter - end : [/hoge/foo]
INFO EntityCoderPerformanceLogFilter - end : [/hoge/foo]
INFO HeaderDecoratorPerformanceLogFilter - end : [/hoge/foo]
INFO AuthorizationPerformanceLogFilter - end : [/hoge/foo]
INFO AuthenticationPerformanceLogFilter - end : [/hoge/foo]

javax.ws.rs.Priorities のクラスを見れば分かる通り、リクエストは数字が小さいものから順に、レスポンスは数字が大きいものから順に適用されています。