web-dev-qa-db-ja.com

JAX-RSリクエストのインターセプト:ContainerRequestFilterをTomcatに登録します

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>

しかし、それも機能しません。何が足りないのですか?そのフィルターを機能させる方法はありますか?どんな助けでも本当にありがたいです!

5
tareq

クラスでJAX-RS2.0 API(リクエストフィルター、名前バインディングなど)を使用していますが、web.xmlでJersey1独自のinitパラメーターを使用しています(com.Sun.jerseyで始まるパッケージ、Jersey 2はorg.glassfish.jerseyを使用します)。これを見てください answer そしてこれらの記事を見てください:

9
Michal Gajdos

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>
1
Vitorlui

より「古典的な」アプローチについては このブログ投稿 をご覧ください(注釈を使用しない)

0
ACV