我们正在计划将Jersey的参考实现用于我们的REST API。作为原型的努力,我也在玩弄ContainerRequestFilters,并且实现了它们中的多个。有没有一种方法可以控制这些过滤器的执行顺序?用于泽西岛的多个ContainerRequestFilter
我在这里考虑的场景是确保安全过滤器必须是第一个运行的,并且如果需要的话建立SecurityContext然后执行其他过滤器。
我们正在计划将Jersey的参考实现用于我们的REST API。作为原型的努力,我也在玩弄ContainerRequestFilters,并且实现了它们中的多个。有没有一种方法可以控制这些过滤器的执行顺序?用于泽西岛的多个ContainerRequestFilter
我在这里考虑的场景是确保安全过滤器必须是第一个运行的,并且如果需要的话建立SecurityContext然后执行其他过滤器。
是的,你可以用javax.annotation.Priority
属性和默认javax.ws.rs.Priorities
来控制它。例如,如果你想:
你可以这样做:
@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
}
}
我正在使用一个库,它有一个过滤器。 我有一个应用程序。现在我无法为库过滤器类添加'@ Priority'。所以这是以默认优先级运行的。如何在这里设置正确的优先顺序,以便我的应用程序筛选器在库之前运行? –
@KiranAB:只需在您的过滤器上设置优先级低于库过滤器的优先级。 – Rouliboy
其中泽西岛版本是你使用? – Jonas