如何在ContainerRequestFilter中检索请求的匹配资源

时间:2012-08-04 20:34:37

标签: java annotations jersey jax-rs

我正在使用JAX-RS / Jersey开发WebService。

我已经设置了一个 ContainerRequestFilter ,其目的是对用户进行身份验证。我只需要通过身份验证保护一些路径,其余的都可以供所有人使用。

我想通过我的ContainerRequestFilter中的ExtendedUriInfo检索matchedResources / matchedResults,以便我可以检查路径是否应该受到保护。有没有办法创建一个在填充ExtendedUriInfo之后但在调用匹配的资源类和方法之前调用的过滤器?

3 个答案:

答案 0 :(得分:9)

这是一个更一般的答案(例如,如果你正在使用像CXF这样的另一个jax-rs实现):

只需在过滤器类中添加以下内容作为实例变量:

  

@Context

     

ResourceInfo信息;

     

“javax.ws.rs.container.ResourceInfo是一个新的JAX-RS上下文,它可以   注入过滤器和拦截器并检查哪个资源   即将调用类和方法。

(来源:https://cwiki.apache.org/confluence/display/CXF20DOC/JAX-RS+Basics#JAX-RSBasics-ResourceInfo

Original answer here

答案 1 :(得分:5)

使用 ContainerRequestFilter 找到了一种方法:

public void filter(ContainerRequestContext requestContext) {
    UriRoutingContext routingContext = (UriRoutingContext) requestContext.getUriInfo();
    ResourceMethodInvoker invoker = (ResourceMethodInvoker) routingContext.getInflector();
    Class<?> className = invoker.getResourceClass();
    Method methodName = invoker.getResourceMethod();
}

答案 2 :(得分:3)

我设法搞清楚了。

我发现的方法是放弃在 ContainerRequestFilter 中执行此操作,而是创建 ResourceFilterFactory 。在 ResourceFilterFactory 中我可以使用

AbstractMethod.isAnnotationPresent(clazz)

确定我的自定义注释是否存在。如果我的注释存在,我可以返回一个包含我的 AuthenticationContainerRequestFilter 的列表。

阅读此答案的任何人的另一个提示是,当使用 ResourceFilterFactory 方法时,ContainerRequestFilter中的注入将不起作用。我所做的是在 ResourceFilterFactory 中进行任何注入,然后通过其构造函数将注入的对象传递给 ContainerRequestFilter