Dropwizardを学ぶシリーズ、第2回です。
今回は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を使う、という使い分けでいいんでしょうかね。