2013-12-12 59 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