2013-12-12 66 views
7

我們正在計劃將Jersey的參考實現用於我們的REST API。作爲原型的努力,我也在玩弄ContainerRequestFilters,並且實現了它們中的多個。有沒有一種方法可以控制這些過濾器的執行順序?用於澤西島的多個ContainerRequestFilter

我在這裏考慮的場景是確保安全過濾器必須是第一個運行的,並且如果需要的話建立SecurityContext然後執行其他過濾器。

+0

其中澤西島版本是你使用? – Jonas

回答

8

是的,你可以用javax.annotation.Priority屬性和默認javax.ws.rs.Priorities來控制它。例如,如果你想:

  1. 日誌過濾器始終運行第一
  2. 認證過濾器應該運行下一個
  3. 授權過濾器應該運行下一個
  4. 自定義過濾器總是要別人後運行

你可以這樣做:

@Priority(Integer.MIN_VALUE) 
public class CustomLoggingFilter implements ContainerRequestFilter 
{ 
    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException 
    { 
     // DO LOGGING HERE, THIS RUNS FIRST 
    } 
} 

@Priority(Priorities.AUTHENTICATION) 
public class AuthenticationFilter implements ContainerRequestFilter 
{ 
    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException 
    { 
     String authHeader = requestContext.getHeaderString(HttpHeaders.WWW_AUTHENTICATE); 

     // DO AUTHENTICATION HERE, THIS RUNS SECOND 
    } 
} 

@Priority(Priorities.AUTHORIZATION) 
public class AuthorizationFilter implements ContainerRequestFilter 
{ 
    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException 
    { 
     String authHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION); 

     // DO AUTHORIZATION HERE, THIS RUNS THIRD 
    } 
} 

@Priority(Priorities.USER) 
public class MyAwesomeStuffFilter implements ContainerRequestFilter 
{ 
    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException 
    { 
     // DO AWESOME STUFF HERE, THIS RUNS LAST 
    } 
} 
+0

我正在使用一個庫,它有一個過濾器。 我有一個應用程序。現在我無法爲庫過濾器類添加'@ Priority'。所以這是以默認優先級運行的。如何在這裏設置正確的優先順序,以便我的應用程序篩選器在庫之前運行? –

+0

@KiranAB:只需在您的過濾器上設置優先級低於庫過濾器的優先級。 – Rouliboy