泽西请求仅对某些URI进行过滤

时间:2014-05-13 20:52:04

标签: java rest jersey

我正在尝试使用ContainerRequestFilter对进入我服务的请求进行一些验证。一切都运行良好,但是有一个问题 - 每个请求都会通过过滤器,即使某些过滤器永远不会应用于它们(一个过滤器只在ResourceOne上验证,另一个只在ResourceTwo等上验证。)

有没有办法在某些条件下将过滤器设置为仅在请求上调用?

虽然它不是阻碍者或阻碍者,但能够阻止这种行为会很好:)

3 个答案:

答案 0 :(得分:47)

我假设你正在使用Jersey 2.x(JAX-RS 2.0 API的实现)。

您有两种方法可以实现目标。

<强> 1。使用名称绑定:


1.1创建使用@NameBinding注释的自定义注释:

@NameBinding
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationForResourceOne {}

1.2。使用您的注释创建过滤器:

@Provider
@AnnotationForResourceOne
public class ResourceOneFilter implements ContainerRequestFilter {
...
}

1.3。并使用选定的资源方法绑定创建的过滤器:

@Path("/resources")
public class Resources {
    @GET
    @Path("/resourceOne")
    @AnnotationForResourceOne
    public String getResourceOne() {...}
}

<强> 2。使用DynamicFeature:


2.1。创建过滤器:

public class ResourceOneFilter implements ContainerRequestFilter {
...
}

2.2。实现javax.ws.rs.container.DynamicFeature接口:

@Provider
public class MaxAgeFeature implements DynamicFeature {
    public void configure(ResourceInfo ri, FeatureContext ctx) {
        if(resourceShouldBeFiltered(ri)){
            ResourceOneFilter filter = new ResourceOneFilter();
            ctx.register(filter);
        }
    }
}

在这种情况下:

  • 过滤器未使用@Provider注释进行注释;
  • 为每个资源方法调用
  • configure(...)方法;
  • ctx.register(filter)使用资源方法绑定过滤器;

答案 1 :(得分:10)

当我们使用@NameBinding时,我们需要从过滤器中删除@PreMatching注释。 @PreMatching会导致所有请求都通过过滤器。

答案 2 :(得分:2)

@PreMatching不能与@NameBinding一起使用,因为在预匹配阶段尚不知道资源类/方法。 我通过从过滤器中删除@PreMatching并使用绑定优先级来解决此问题。请参阅ResourceConfig.register(Object component, int bindingPriority)

在资源获得更高优先级之前执行的过滤器。