filterの書き方 その2

前回は全体に適用されるFilterの書き方について説明しました。
今回は特定のリクエストのみにFilterを適用させてみます。

例えば、ログインしているかを確認する必要がある画面のみに適用させる場合です。

今回は自作のアノテーションを作成します。
今回はCookieの値(ユーザを一意に特定できる値)があるかを確認するためのアノテーションのため「CheckCookie」とします。

@NameBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,
         ElementType.METHOD})
public @interface CheckCookie {
}

次に、適用させるFilterを作ります。
ここでは、リクエストヘッダに含まれる「value」という値のCookieを取得します。
なければHTTPステータスコードを403(Forbidden)で返却します。

通常であればここで、Cookieの値からユーザ認証を行います。

@CheckCookie
@Provider
@Priority(Priorities.AUTHENTICATION)
public class CookieFilter implements ContainerRequestFilter {

	private static final Logger log = Logger.getLogger(CookieFilter.class);
	
	public void filter(ContainerRequestContext context) throws IOException {
		if(context.getCookies().get("value") == null) {
			log.info("no cookie");
			context.abortWith(Response.status(Status.FORBIDDEN).build());
		}
		log.info("cookieValue : " + context.getCookies().get("value").getValue());
	}
}

あとは、このFilterを適用させたいResourceにアノテーションを付与するだけです。

@CheckCookie
@Path("hoge")
public class HogeResource {
    @GET
    @Path("/foo")
    public String foo() {
        ......
    }
}

ここではクラスにアノテーションを付与していますが、メソッド単位に付与することもできます。