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

Kin*_*isG 23 java rest jersey

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

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

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

pWo*_*Woz 48

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

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

1.使用名称绑定:


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

@NameBinding
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationForResourceOne {}
Run Code Online (Sandbox Code Playgroud)

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

@Provider
@AnnotationForResourceOne
public class ResourceOneFilter implements ContainerRequestFilter {
...
}
Run Code Online (Sandbox Code Playgroud)

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

@Path("/resources")
public class Resources {
    @GET
    @Path("/resourceOne")
    @AnnotationForResourceOne
    public String getResourceOne() {...}
}
Run Code Online (Sandbox Code Playgroud)

2.使用DynamicFeature:


2.1.创建过滤器:

public class ResourceOneFilter implements ContainerRequestFilter {
...
}
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下:

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

  • 你确定在NameBinding示例中需要`@ PreMatching`注释吗? (6认同)
  • @Zakhar你是对的,如果我们使用`@ PreMatching`,过滤器/拦截器将适用于所有请求,无论注释是什么使`@ NameBinding`无用.有关详细信息,请参阅https://jersey.java.net/documentation/latest/filters-and-interceptors.html (2认同)

Aru*_*han 10

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