Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在ContainerRequestFilter中检索请求的匹配资源_Java_Annotations_Jersey_Jax Rs - Fatal编程技术网

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

Java 如何在ContainerRequestFilter中检索请求的匹配资源,java,annotations,jersey,jax-rs,Java,Annotations,Jersey,Jax Rs,我正在使用JAX-RS/Jersey开发一个Web服务 我已经设置了一个ContainerRequestFilter,其目的是对用户进行身份验证。我只需要通过身份验证来保护一些路径,其余的路径可以供所有人使用 我想通过ContainerRequestFilter中的ExtendeDriInfo检索matchedResources/matchedResults,以便检查路径是否应受到保护。有没有一种方法可以创建一个过滤器,在填充extendedriinfo之后,但在调用匹配的资源类和方法之前调用它

我正在使用JAX-RS/Jersey开发一个Web服务

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


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

我设法找到了答案

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

AbstractMethod.isAnnotationPresent(clazz)
以确定是否存在自定义批注。如果存在注释,则可以返回包含AuthenticationContainerRequestFilter的列表

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

找到了一种使用ContainerRequestFilter的方法:

公共无效筛选器(ContainerRequestContext请求上下文){
UriRoutingContext routingContext=(UriRoutingContext)requestContext.getUriInfo();
ResourceMethodInvoker invoker=(ResourceMethodInvoker)routingContext.getIncomector();
Class className=invoker.getResourceClass();
方法methodName=invoker.getResourceMethod();
}

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

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

@上下文

资源信息

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

(来源:)


听起来你在重新发明一点Java EE!如果没有EJB坐在Web服务后面,请考虑添加一个EJB。你可以随意添加角色注释。谢谢你的建议。我还没有深入研究角色,但我觉得角色只在配置了auth方法的情况下工作。我有一个登录方法,在用户登录后,他/她使用accessToken+userId对与web服务通信。无可否认,我通过web服务进行身份验证的经验很弱。我确实知道,通过servlet接口,有一个API可以记录用户在auth方法中的行为。简而言之,servlet可以“编写自己的”身份验证方法。我一直认为web服务也有这样的机制,因为您使用的是过滤器,所以该机制应该对您可用:参见,java.lang.String)
public void filter(ContainerRequestContext requestContext) {
    UriRoutingContext routingContext = (UriRoutingContext) requestContext.getUriInfo();
    ResourceMethodInvoker invoker = (ResourceMethodInvoker) routingContext.getInflector();
    Class<?> className = invoker.getResourceClass();
    Method methodName = invoker.getResourceMethod();
}