gpt4 book ai didi

java - 如何使用 Jersey ContainerRequestFilter 和 ContainerResponseFilter 匹配 http 请求和响应

转载 作者:可可西里 更新时间:2023-11-01 16:42:23 24 4
gpt4 key购买 nike

我有一个高度并发的服务器,需要实现一些特殊的日志记录。我需要一种简单的方法来匹配请求和响应。 ContainerResponseFilter 中的 filter() 具有 requestresponse。但是我无法访问 http 帖子内容,因为流已被读取。

有什么方法可以在 ContainerRequestFilter filter() 中添加一个 ID 并以某种方式在 ContainerResponseFilter filter() 时自动返回它> 叫什么?我无法修改真正的应用程序。

我有另一个程序需要处理日志文件并能够将请求与响应相匹配。

还有什么建议吗?

最佳答案

我能想到的唯一解决方案包括 "Cloning the InputStream" (another link)。看起来工作量增加了一倍,但我看不出还能如何实现(无需编写一堆 MessageBodyReader)。

然后我们可以使用ContainerRequestContext.setProperty(String, Object)设置比在整个请求/响应过滤器链中可以获得的任意属性。在响应过滤器中,您可以使用 ContainerResponseContext.getProperty(String)

这是一个示例,我希望使用 JSON,并使用 Jackson ObjectMapper 获取 JSON 映射并获取 id 值,然后在上下文中设置属性。

@Provider
public class RequestFilter implements ContainerRequestFilter {

ObjectMapper mapper = new ObjectMapper();

@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
if (!requestContext.getMethod().equalsIgnoreCase("POST")) {
return;
}

InputStream entityStream = requestContext.getEntityStream();

ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = entityStream.read(buffer)) > -1) {
baos.write(buffer, 0, len);
}
baos.flush();

String contentType = requestContext.getHeaderString(HttpHeaders.CONTENT_TYPE);
if (MediaType.APPLICATION_JSON.equals(contentType)) {

// User Jackson ObjectMapper to get JSON as Map
Map<String, Object> jsonMap = mapper.readValue(
new ByteArrayInputStream(baos.toByteArray()),
TypeFactory.defaultInstance().constructMapType(
Map.class, String.class, Object.class));

Object id = jsonMap.get("id");
// Put id into context as property to be retrieved from response filter
requestContext.setProperty("id", id);
}

requestContext.setEntityStream(new ByteArrayInputStream(baos.toByteArray()));
}
}

以上示例使用 Jersey 2.x。如果您使用的是 Jersey 1.x,我在 ContainerRequest 中看不到任何设置任意属性的方法,但我想您可以设置一个临时 header

containerRequest.getRequestHeaders().putSingle("X-Temp-ID", id);

然后你就可以在响应过滤器中获取标题。

关于java - 如何使用 Jersey ContainerRequestFilter 和 ContainerResponseFilter 匹配 http 请求和响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28619461/

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