泽西岛请求筛选器仅适用于某些 URI
我正在尝试使用 .一切正常,但有一个问题 - 每个请求都通过过滤器,即使某些过滤器永远不会应用于它们(一个过滤器仅在ResourceOne上验证,另一个仅在ResourceTwo上验证等)。ContainerRequestFilter
有没有办法将筛选器设置为仅在特定条件下对请求调用?
虽然它不是阻碍者或障碍,但能够阻止这种行为会很好,:)
我正在尝试使用 .一切正常,但有一个问题 - 每个请求都通过过滤器,即使某些过滤器永远不会应用于它们(一个过滤器仅在ResourceOne上验证,另一个仅在ResourceTwo上验证等)。ContainerRequestFilter
有没有办法将筛选器设置为仅在特定条件下对请求调用?
虽然它不是阻碍者或障碍,但能够阻止这种行为会很好,:)
我假设您正在使用泽西岛 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. 使用动态功能:
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)
将过滤器与资源方法绑定;当我们使用时,我们需要从过滤器中删除注释。 导致所有请求都通过筛选器。@NameBinding
@PreMatching
@PreMatching