gpt4 book ai didi

java - JAX-RS,组件可以通过请求生命周期访问哪些信息

转载 作者:行者123 更新时间:2023-12-02 03:00:40 25 4
gpt4 key购买 nike

在JAX-RS中处理请求时,我研究的是整个过程的流程如下;
enter image description here
我知道有不同的组件,它们用于可插入性的目的,就像我们可以有过滤器并且可以将它们插入到任何资源方法中
我们想要,拦截器也是如此(我知道它们是围绕 MessageBodyWriters 和 MessageBodyReaders 触发的)。但我对每个组件都感到困惑
以及每个组件在请求通过它们时可以访问的信息,
我学到的症结是:

过滤器
只能修改(或应该处理)标题。但是我在过滤器的 ContainerRequestContext 中看到了一个 getEntityStream 方法。这个方法也指的是哪个流?
enter image description here

拦截器
好吧,我唯一的例子是通过互联网将流压缩到一些 GzipReader(或类似的东西)中。它是拦截器的唯一用途吗?而且我怀疑拦截器中可以使用整个请求主体,请参见下图。
enter image description here

MessageBodyReader/Writers
它们是可以理解的,我猜它们具有与拦截器相同级别的请求信息。

问题:
我不明白每个组件可以从传入的请求中访问什么,以及每个组件中应该修改什么,这个问题可能很广泛,但专门
指向查询解决方案的链接可能会有所帮助。
编辑:
刚测试过。过滤器可以访问消息体并可以对其进行修改,拦截器也是如此。 ://

最佳答案

让我从过滤器开始:

过滤器:

过滤器可以修改入站和出站请求和响应,包括修改 header 、实体和其他请求/响应参数。

进一步的过滤器被归类为 容器/服务器过滤器 客户过滤器 .

考虑服务器过滤器:还有另外两种明显的类型:

  • 请求过滤器
  • 响应过滤器

  • 这两种类型之间有两个主要区别(取决于他们访问的内容):
  • 响应过滤器 实现容器响应过滤器 接口(interface),有两个参数:

  • 容器请求 (ContainerRequestContext requestContext)

    容器响应 (ContainerResponseContext responseContext) .

    现在这两个参数访问的是什么:
    public interface ContainerRequestContext
    容器请求过滤上下文。为过滤器提供特定于请求的信息的可变类,例如请求 URI、消息头、消息实体或请求范围的属性。公开的 setter 允许修改公开的请求特定信息。
    public interface ContainerResponseContext
    容器响应过滤器上下文。一个可变类,为过滤器提供特定于响应的信息,例如消息头、消息实体或请求范围的属性。公开的 setter 允许修改公开的响应特定信息。

    请注意,requestContext 可以访问另外一件事:requestURI
  • 请求过滤器 实现 ContainerRequestFilter 并且只有一个参数:

  • 容器请求 (ContainerRequestContext requestContext)
    来到你的问题:

    方法 setEntityStream(arg0) 和 getEntityStream() 中引用了哪个流?

    这可以分解为:
  • 获取实体流():
    服务器端的请求实体流是从客户端请求和响应实体流中读取实体的位置
    是从服务器响应中读取实体的位置。
  • setEntityStream(arg0): 在服务器上意味着当写出响应实体和在客户端写请求实体时
    请求发送到服务器。**

  • 编辑:
  • 过滤器可用于验证任何请求的某些标准。如果不满足条件,过滤器也可以中止响应。

  • 考虑以下来自 jersey documentation 的示例:
    public class AuthorizationRequestFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext)
    throws IOException {

    final SecurityContext securityContext =
    requestContext.getSecurityContext();
    if (securityContext == null ||
    !securityContext.isUserInRole("privileged")) {

    requestContext.abortWith(Response
    .status(Response.Status.UNAUTHORIZED)
    .entity("User cannot access the resource.")
    .build());
    }
    }
    }

    示例中的 AuthorizationRequestFilter 检查经过身份验证的用户是否具有特权角色。当过滤器方法完成时,作为参数传递给 abortWith 方法的响应用于响应请求。响应过滤器(如果已注册)将被执行并有可能处理中止的响应。
  • 过滤器可以影响将匹配的方法。 预匹配过滤器 是在请求匹配开始之前执行的请求过滤器。
    @PreMatching
    public class PreMatchingFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext)
    throws IOException {
    // change all PUT methods to POST
    if (requestContext.getMethod().equals("PUT")) {
    requestContext.setMethod("POST");
    }
    }
    }

  • PreMatchingFilter 是一个简单的预匹配过滤器,它将所有 PUT HTTP 方法更改为 POST。当您希望始终使用相同的 Java 代码处理这些 PUT 和 POST HTTP 方法时,这可能很有用。

    拦截器:

    Write-Interceptor 将实体包装到 GZIPOutput 流中,Reader-Interceptor 将实体包装到 GZIPInput 流中,GZIPInput 流从接收到的压缩实体中解压缩数据。

    此外,拦截器也可用于提供 数字签名 .对于数字签名,需要计算正文的哈希并将其添加到签名请求(客户端)或响应(服务器端) header 中。

    关于java - JAX-RS,组件可以通过请求生命周期访问哪些信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42407773/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com