文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

Dropwizardを学ぶ:vol2:JerseyFilterとServletFilter

Dropwizardを学ぶシリーズ、第2回です。


f:id:treeapps:20180426142529p:plain

今回はJerseyFilterとServletFilterについてです。

JerseyFilterとServletFilterの違い

主な違いは、実行される順番と取得できる値の違いがあります。

実行順序

ServletFilter → JerseyFilter、の順番に実行されます。
例えば

public class HelloWorldApplication extends Application<HelloWorldConfiguration> {
    public static void main(String[] args) throws Exception {
        new HelloWorldApplication().run(args);
    }

    @Override
    public void run(HelloWorldConfiguration configuration, Environment environment) {
        /**
         * jersey filter
         */
        environment.jersey().getResourceConfig().getContainerRequestFilters().add(new DateNotSpecifiedFilter());
        /**
         * servlet Filter
         */
        environment.servlets().addFilter("DateHeaderServletFilter", new DateNotSpecifiedServletFilter())
                .addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
    }
}

と記述したとしても、ServletFilterの方が先に実行されます。

取得できる値

ServletFilterはStrutsやSaStrutsでお馴染みのServletRequestとServletResponseが取得できます。

例えば
http://localhost:8080/hello-world?name=XXX
というURLの場合、それぞれ以下の値が取得できます。

JerseyFilter
extendedUriInfo.getAbsolutePath() http://localhost:8080/hello-world
extendedUriInfo.getBaseUri() http://localhost:8080/
extendedUriInfo.getRequestUri() http://localhost:8080/hello-world?name=XXX
ServletFilter
req.getRequestURL http://localhost:8080/hello-world
req.getRequestURI /hello-world

SaStrutsと違い、どちらの値も残念な値でなく、欲しい値が取得できています。JerseyFilterのExtendedUriInfoにはアプリに則したより実用的な情報が取得できます。

SaStrutsで取得できる残念な値については、先日以下の記事を書いたので、合わせて御覧ください。

雑感

Dropwizardにはインターセプターはありませんが、2種類のfilterで代用できます。

基本はJerseyFilterを使って、サーブレットコンテナのrole機能等を使いたい時だけ、ServletFilterを使う、という使い分けでいいんでしょうかね。