如何检索请求的资源相匹配的ContainerRequestFilter(How to retriev

2019-09-20 19:51发布

我使用的JAX-RS /泽西上一个WebService工作。

我已经成立了一个ContainerRequestFilter,其目的是对用户进行认证。 我只需要保护一些身份验证的路径,其余的可以提供给大家。

我想找回通过ExtendedUriInfo matchedResources / matchedResults我ContainerRequestFilter,这样我可以检查是否路径应该受到保护与否。 有没有一种方法来创建它ExtendedUriInfo填充后调用的过滤器,但匹配的资源类和方法之前被调用?

Answer 1:

这里是一个更普遍的答案(例如,如果你使用其他JAX-RS实现类似CXF):

只需添加以下过滤器中的类作为一个实例变量:

@Context

ResourceInfo中的信息;

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

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

这里原来的答案



Answer 2:

发现了一种与ContainerRequestFilter做到这一点:

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


Answer 3:

我设法弄明白。

我已经找到工作的方法是放弃在ContainerRequestFilter这样做,并创建一个ResourceFilterFactory代替。 在ResourceFilterFactory我可以使用

AbstractMethod.isAnnotationPresent(clazz)

确定我的自定义的注释存在。 如果我的注释存在,然后我就可以返回包含我的AuthenticationContainerRequestFilter列表。

任何人阅读这个答案另一个技巧是使用ResourceFilterFactory方法时注入的ContainerRequestFilter将无法正常工作。 我所做的就是做在ResourceFilterFactory任何注射,然后通过其构造函数传递注入对象的ContainerRequestFilter。



文章来源: How to retrieve matched resources of a request in a ContainerRequestFilter