【问题标题】:How to retrieve matched resources of a request in a ContainerRequestFilter如何在 ContainerRequestFilter 中检索请求的匹配资源
【发布时间】:2012-08-04 20:34:37
【问题描述】:

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

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

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

【问题讨论】:

  • 听起来您正在重新发明一点 Java EE!如果您的 Web 服务后面没有 EJB,请考虑添加一个。您可以随意使用角色进行注释。
  • 感谢理查德的建议。我还没有过多地研究角色,但我的印象是角色只能与配置的 auth-method 一起使用。我有一个 login 方法,在用户登录后,他/她使用 accessToken + userId 对与 WebService 进行通信。
  • 诚然,我通过 Web 服务进行身份验证的经验很薄弱。我确实知道通过 servlet 接口有一个 API 可用于登录用户 - 侧步验证方法。简而言之,servlet 可以“编写自己的”身份验证方法。我一直认为网络服务也有这种情况。
  • 由于您使用的是过滤器,因此您应该可以使用该机制:请参阅docs.oracle.com/javaee/6/api/javax/servlet/http/…, java.lang.String)

标签: java annotations jersey jax-rs


【解决方案1】:

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

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

@上下文

资源信息信息;

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

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

Original answer here

【讨论】:

    【解决方案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();
    }
    

    【讨论】:

      【解决方案3】:

      我设法弄明白了。

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

      AbstractMethod.isAnnotationPresent(clazz)
      

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

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

      【讨论】:

        猜你喜欢
        • 2015-04-21
        • 2023-01-30
        • 2016-12-01
        • 2017-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多