12

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

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

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

4

3 回答 3

10

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

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

@语境

资源信息信息;

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

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

原始答案在这里

于 2013-12-11T13:10:25.530 回答
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();
}
于 2013-11-11T09:18:50.207 回答
3

我设法弄清楚了。

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

AbstractMethod.isAnnotationPresent(clazz)

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

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

于 2012-08-05T23:43:36.053 回答