Jersey的多个ContainerRequestFilter

viv*_*ekj 8 rest jersey java-ee

我们计划在我们的REST API中使用Jersey的参考实现.作为一个原型工作,我也在使用ContainerRequestFilters,我实现了多个.有没有办法控制执行这些过滤器的顺序?

我在这里考虑的方案是确保安全过滤器必须是第一个运行,并且如果需要,建立SecurityContext然后执行其他过滤器.

Ald*_*den 9

是的,您可以使用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
    }
}
Run Code Online (Sandbox Code Playgroud)