ContainerRequestFilterによってJAX-RSWebサービスへのリクエストをインターセプトしようとしています。カスタムアノテーションを付けて使用したいので、Webサービスの特定のメソッドを装飾できます。これにより、実際のメソッドが実行される前に、セキュリティで保護されたチャネルで行われたかどうかの情報に基づいて、このメソッドへのリクエストを処理できるようになります。
私はさまざまなアプローチを試し、いくつかの投稿を検索してから、主にこの post のAldenの回答に基づいて実装しました。しかし、私はそれを機能させることができません。
カスタムアノテーションSslで装飾されたWebサービスのメソッドテストがあります。
@POST
@Path("/test")
@Ssl
public static Response test(){
System.out.println("TEST ...");
}
注釈は次のようになります。
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface Ssl {}
次に、フィルターの実装を設定します
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.ext.Provider;
@Ssl
@Provider
public class SslInterceptor implements ContainerRequestFilter
{
@Override
public void filter(ContainerRequestContext requestContext) throws IOException
{
System.out.println("Filter executed.");
}
}
ただし、フィルターが実行されることはなく、エラーメッセージや警告も発生しません。テストメソッドはとにかく正常に実行されます。
それを解決するために、説明されているようにweb.xmlにフィルターを登録しようとしました ここ 。
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>com.Sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.Sun.jersey.config.property.resourceConfigClass</param-name>
<param-value>com.Sun.jersey.api.core.PackagesResourceConfig</param-value>
</init-param>
<init-param>
<param-name>com.Sun.jersey.config.property.packages</param-name>
<param-value>com.my.packagewithfilter</param-value>
</init-param>
<init-param>
<param-name>com.Sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.my.packagewithfilter.SslInterceptor</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.my.packagewithfilter</param-value>
</init-param>
</servlet>
しかし、それも機能しません。何が足りないのですか?そのフィルターを機能させる方法はありますか?どんな助けでも本当にありがたいです!
クラスでJAX-RS2.0 API(リクエストフィルター、名前バインディングなど)を使用していますが、web.xml
でJersey1独自のinitパラメーターを使用しています(com.Sun.jersey
で始まるパッケージ、Jersey 2はorg.glassfish.jersey
を使用します)。これを見てください answer そしてこれらの記事を見てください:
Michael Gajdosからの回答を編集するだけで、タブをもっと開きたくない人を助けることができます。
Jersey-2を使用している場合は、次の構成を使用してフィルターをweb.xmlに登録する必要があります。
jersey.config.server.provider.classnames
の代わりに
com.Sun.jersey.spi.container.ContainerRequestFilters(jersey-1x)
<!-- This is the config needed -->
<servlet>
//...
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>com.your_package_path.yourClassFilter</param-value>
</init-param>
//...
</servlet>
より「古典的な」アプローチについては このブログ投稿 をご覧ください(注釈を使用しない)