我正在使用JAX-RS / Jersey开发WebService。
我已经设置了一个 ContainerRequestFilter ,其目的是对用户进行身份验证。我只需要通过身份验证保护一些路径,其余的都可以供所有人使用。
我想通过我的ContainerRequestFilter中的ExtendedUriInfo检索matchedResources / matchedResults,以便我可以检查路径是否应该受到保护。有没有办法创建一个在填充ExtendedUriInfo之后但在调用匹配的资源类和方法之前调用的过滤器?
答案 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)
答案 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 。