2016-05-26 25 views
1

Tomcat 8でRESTeasy 3.0.17FINALで認証フィルターを実装しようとしています。ここに私のweb.xmlの項目があります。ここでRESTeasy ContainerRequestFilterが呼び出されない

<!-- RESTEasy Config --> 
<listener> 
    <listener-class> 
     org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap 
    </listener-class> 
</listener> 
<servlet> 
    <servlet-name>RESTEasy</servlet-name> 
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>RESTEasy</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 
<context-param> 
    <param-name>resteasy.scan</param-name> 
    <param-value>true</param-value> 
</context-param> 
<context-param> 
    <param-name>resteasy.scan.providers</param-name> 
    <param-value>true</param-value> 
</context-param> 
<context-param> 
    <param-name>resteasy.servlet.mapping.prefix</param-name> 
    <param-value>/rest</param-value> 
</context-param> 

私は私のテストAPI

@Path("/test") 
public class TestAPI extends APIServlet { 

    @GET 
    @Path("/{id}") 
    @AllowUsers 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response printMessage(@PathParam("id") int id) { 
     JsonObject json = new JsonObject(); 
     json.addProperty("status", "awesome"); 
     json.addProperty("yeah", "It worked"); 
     return Response.ok(json).build(); 
    } 
} 

そして、ここでは私の一時的なフィルタであります

@Provider 
public class AuthFilter implements ContainerRequestFilter { 

    @Override 
    public void filter(ContainerRequestContext containerRequestContext) throws IOException { 
     if(Math.random() < 0.5) { 
      containerRequestContext.abortWith(Response.status(403).build()); 
     } 
     System.out.println("Filtered"); 
    } 
} 

は私のフィルタが呼び出されていませんさん。 printlnに到達することはありません、私は正常にブレークポイントをフィルタに配置することはできません。 catalineまたはlocalhostログにエラーメッセージはありません。私は、次のような名前バインディングアノテーションを使用して試してみました:

@NameBinding 
@Inherited 
@Target({ElementType.TYPE, ElementType.METHOD }) 
@Retention(value = RetentionPolicy.RUNTIME) 
public @interface Secured { 
} 

AuthFilter上とprintMessage@GET上記@Provider上記@Securedで。それはどちらもうまくいかない。

私はなぜ私のフィルタは決して呼ばされていないweb.xml

<context-param> 
    <param-name>resteasy.providers</param-name> 
    <param-value>com.myPackage.mvc.servlet.API.AuthFilter</param-value> 
</context-param> 

でフィルタをリスト明示的に試してみましたか?私は@Providerとマークされた2つの他のクラスを持っていて、それらはシステムによって認識されており、ブレークポイントを配置することができ、彼らは期待どおりに働いています。

答えて

0

@PreMatchingまたは@PostMatchingを追加し、私は、ジャージーの代わりに、RESTEasyのに切り替え、すべてがちょうど働きました。

+0

あなたのRESTエンドポイントは保護するメソッド(またはクラス)の上に@Securedを呼び出す必要があります – Rilcon42

0

あなたContainerRequestFilter

+0

javax.ws.rs.ext.Providersがファイルで、内容は次のようにフィルタのパスです。私は私のコンピュータに戻ってきたときにもう一度やり直すことができます – DontTurnAround

+0

いいえ、うまくいきませんでした。まったく同じ問題。 – DontTurnAround

+0

私はTomcatを使用していませんが、 '@ Privoder'は私のためには機能しませんでした。私は手動で、Resteasy providerFactoryのようなrestaasy providerFactoryに手動でフィルターインスタンスを追加します。 'ResteasyproviderFactory.getContainerRequestFilterRegistry()。registerSingleton(new AuthFilter());' – taoxiaopang

0

/META-INF/services/javax.ws.rs.ext.Providersのように、META-INF/servicesにプロバイダファイルを追加します。私はそれを試したし、それが動作しませんでしたかなり確信している

com.hujiang.foe.instalment.liquidation.biz.impl.account.filter.ContextCleanFilter 
関連する問題