web-dev-qa-db-ja.com

Jersey ContainerRequestFilterがトリガーされない

TomcatベースのJerseyアプリケーションで認証を強制するためにContainerRequestFilterを使用しようとしています。 このドキュメント に従いました。問題:フィルターがトリガーされない

フィルタークラス:

@Provider
public class AuthFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext)
        throws IOException {

        // MY AUTHENTICATION CODE GOES HERE

    }

Web.xmlファイル:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://Java.Sun.com/xml/ns/javaee"
    xmlns:web="http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="debate-rest"
    version="3.0">
  <display-name>rest</display-name>
   <servlet>  
    <servlet-name>Jersey REST Service</servlet-name>  
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>  
    <init-param>
        <param-name>com.Sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>com.hck.debate.rest.security.AuthFilter</param-value>
    </init-param>
    <init-param>  
      <param-name>jersey.config.server.provider.packages</param-name>  
      <param-value>com.hck.debate.rest.controller</param-value>  
    </init-param>  
    <init-param>  
        <param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>  
        <param-value>true</param-value>  
    </init-param>      
    <load-on-startup>1</load-on-startup>  
  </servlet>  
  <servlet-mapping>  
    <servlet-name>Jersey REST Service</servlet-name>  
    <url-pattern>/*</url-pattern>  
  </servlet-mapping>
38
koyaga

わかりました、jersey.config.server.provider.packages init paramは、サービスクラス(APIエンドポイント)だけでなく、フィルターを含むすべてのクラスを参照する必要があります。

今では動作します:

<init-param>  
  <param-name>jersey.config.server.provider.packages</param-name>  
  <param-value>com.hck.debate.rest.controller;com.hck.debate.rest.security</param-value>
</init-param>
<init-param>
    <param-name>com.Sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>com.hck.debate.rest.security.AuthFilter</param-value>
</init-param>
34
koyaga

また、フィルターに@ Provider JAX-RS注釈を追加する必要がありました。
これにより、JAX-RSスキャン段階でフィルターが検出可能になります。

@Provider
public class MyAppFilter implements ContainerRequestFilter {
    // filter logic
}
23
uris

いくつかのヒント:

  1. JAX-RSバージョン2.17を使用していることを確認してください。
  2. フィルターで正しいインポートを使用していることを確認してください。

    • import javax.ws.rs.container.ContainerRequestContext;
    • import javax.ws.rs.container.ContainerRequestFilter;
  3. @Provider注釈

5
ACV

ResourceConfig実装クラスに以下の呼び出しがありませんでした。

register(CorrelationIdFilter.class);
2
AshishKumar

ジャージでフィルターを使用するための最小要件:

  • @Providerアノテーションをフィルタークラスに追加します
  • フィルタークラスの名前空間は、「jersey.config.server.provider.packages」init-paramに含める必要があります

他の設定は必要ありません(例: 'com.Sun.jersey.spi.container.ContainerRequestFilters' init-paramまたはResourceConfig)

2
crazyman

JAX-RS 2、ジャージ、および以下の注釈で同じ問題が修正されました

 @PreMatching
2
virtuvious

私のように動けなくなった場合、TomEE 1.7.XはContainerRequestFilterを含まないJAX-RS 1.1を使用することに注意してください。

0
Managarm

@Providerアノテーション(私の場合は機能しませんでした)を使用する代わりに、ContainerRequestFilterJerseyServletFactoryを手動で登録できます。

JerseyServletFactory jerseyServletFactory = new JerseyServletFactory(config);
HttpServlet myServiceServlet = jerseyServletFactory.create(myResource);

// Register your ContainerRequestFilter like this
jerseyServletFactory.addRequestFilter(new MyFilter());

httpServer.register(myServiceServlet, "/api");
httpServer.start();
0

Javax.ws.rsの代わりに、com.Sun.jerseyを使用しました。

import com.Sun.jersey.spi.container.ContainerRequestFilter import com.Sun.jersey.spi.container.ContainerRequest

Dropwizardユーザーはこれを行う必要があります

environment.jersey().getResourceConfig()
           .getContainerRequestFilters()
           .add(filter);
0
jayantmukherji

MULE ESBでこの問題を抱えている人のために。パスを忘れずに登録してください:

<jersey:resources doc:name="REST">
   <component doc:name="rest component">
     <spring-object bean="endpoit"/>
   </component>
   <jersey:package packageName="path @Provider-s"/>
</jersey:resources >
0
HuTa