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