当前位置: 首页 > 面试题库 >

拦截JAX-RS Web服务请求以添加JSON字段

令狐灿
2023-03-14
问题内容

我有一个JAX-RS Web服务,它返回一个带JSON请求参数(映射到Parameter对象),如下所示(它在WebLogic
12.2.1中运行)。是否可以编写一个拦截器或过滤器,以便在调用Web服务时,它将在JSON请求消息中添加一个额外的字段,以便下面的方法将在requestParameters中获得该额外的字段?

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("LogIn")
public Response logIn(@Context HttpServletRequest request, Parameters requestParameters) {...}

谢谢!


问题答案:

拦截器

这可以通过 拦截器 来实现。

拦截器旨在通过操纵实体输入/输出流来操纵实体。有两种拦截器,ReaderInterceptorWriterInterceptor

阅读器拦截器用于操纵入站实体流。这些是来自“电线”的流。因此,使用阅读器拦截器,您可以在服务器端操纵请求实体流。编写器拦截器用于将实体写入“线路”的情况,这在服务器上意味着写出响应实体时

以下实现该ReaderInterceptor接口的拦截器使您可以在服务器端修改请求的实体:

@Provider
public class CustomReaderInterceptor implements ReaderInterceptor {

    @Override
    public Object aroundReadFrom(ReaderInterceptorContext context) 
                      throws IOException, WebApplicationException {

        InputStream stream = context.getInputStream();

        // Manipulate the HTTP entity using the InputStream

        context.setInputStream(stream);
        return context.proceed();
    }
}

请注意,上面的拦截器是 global的 ,也就是说,它将对所有资源方法都执行。

使用Jackson时,您的ReaderInterceptor#aroundReadFrom(ReaderInterceptorContext)方法实现可能类似于:

// Create a Jackson ObjectMapper instance (it can be injected instead)
ObjectMapper mapper = new ObjectMapper();

// Parse the requested entity into a JSON tree
JsonNode tree = mapper.readTree(context.getInputStream());

// Add a property to the JSON
((ObjectNode) tree).put("field", "value");

// Set the input stream containing the manipulated JSON
context.setInputStream(new ByteArrayInputStream(mapper.writeValueAsBytes(tree)));

// Proceed to the next interceptor in the chain
context.proceed();

名称绑定

要仅对某些精选资源方法执行拦截器,可以使用 名称绑定

名称绑定 是一个概念,它允许对JAX-RS运行时说,仅针对特定资源方法才执行特定过滤器或拦截器。当过滤器或拦截器仅限于特定资源方法时,我们说它是
名称绑定的

可以使用@NameBinding注释将过滤器分配给资源方法。该批注用作其他用户实施的批注的元批注,这些其他用户实现的批注已应用于提供程序和资源方法

可以按以下方式定义名称绑定批注(批注的名称取决于您):

@NameBinding
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface CustomizeResponse { }

将上面定义的注释放在您的拦截器类上:

@Provider
@CustomizeResponse
public class CustomReaderInterceptor implements ReaderInterceptor {
    ...
}

要将拦截器分配给资源方法,请将上面定义的注释放在资源方法上:

@GET
@CustomizeResponse
@Produces(MediaType.APPLICATION_JSON)
public Response myMethod() {
    ...
}

名称绑定也可以应用于资源类。这意味着将对该资源类的所有资源方法执行拦截器:

@Path("/foo")
@CustomizeResponse
public class MyResource() {
    ...
}

请注意, 始终执行全局过滤器和拦截器 ,因此即使对于具有任何名称绑定批注的资源方法也是如此。

额外资源

有关拦截器的更多详细信息,请参阅Jersey
文档。



 类似资料:
  • 问题内容: 在Spring Boot应用程序中添加HttpRequest拦截器的正确方法是什么?我想做的是记录每个HTTP请求的请求和响应。 我发现了一些有关如何对较早版本的spring进行相同操作的Web示例,但这些示例与applicationcontext.xml一起使用。请帮忙。 问题答案: 由于你使用的是Spring Boot,因此我假设你希望在可能的情况下依靠Spring的自动配置。要添

  • 我找到了一些关于如何使用spring旧版本执行相同操作的web示例,但这些示例适用于ApplicationContext.xml。请帮帮忙。

  • 一、拦截请求 mitmproxy的强大功能是拦截请求。拦截的请求将暂停,以便用户可以在将请求发送到服务器之前修改(或丢弃)该请求。mitmproxy的set intercept命令配置拦截。i默认情况下,该命令绑定到快捷方式。 通常不希望拦截所有请求,因为它会不断中断您的浏览。因此,mitmproxy希望将流过滤器表达式作为set intercept选择性拦截请求的第一个参数。在下面的教程中,我们

  • 配置拦截器 declarations: [ AppComponent ], HttpClientModule ], providers: [ [ { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true } ] bootstrap:

  • 在 imi 中更加推荐使用 AOP 来拦截请求。 不要忘记把 Aspect 类加入 beanScan! Demo <?php namespace ImiApp\ApiServer\Aop; use Imi\RequestContext; use Imi\Aop\Annotation\Around; use Imi\Aop\Annotation\Aspect; use Imi\Aop\Annota