Java 如何使用ContainerRequestFilter和ContainerResponseFilter匹配http请求和响应

Java 如何使用ContainerRequestFilter和ContainerResponseFilter匹配http请求和响应,java,rest,http,jersey,Java,Rest,Http,Jersey,我有一个高度并发的服务器,需要实现一些特殊的日志记录。我需要一个简单的方法来匹配请求和响应。ContainerResponseFilter中的filter()既有请求也有响应。无论如何,我无法访问http post内容,因为流已经被读取 是否有某种方法可以在ContainerRequestFilter()中添加ID,并在调用ContainerResponseFilter()时自动将其返回?我不能修改真正的应用程序 我有另一个程序需要处理日志文件,并且能够将请求与响应匹配 还有其他建议吗?我能想到

我有一个高度并发的服务器,需要实现一些特殊的日志记录。我需要一个简单的方法来匹配请求和响应。
ContainerResponseFilter
中的
filter()
既有
请求
也有
响应
。无论如何,我无法访问http post内容,因为流已经被读取

是否有某种方法可以在
ContainerRequestFilter()
中添加
ID
,并在调用
ContainerResponseFilter()
时自动将其返回?我不能修改真正的应用程序

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


还有其他建议吗?

我能想到的唯一解决方案是()。这似乎是工作的两倍,但我不知道如何才能实现(不必写一堆MessageBodyReaders)

然后,我们可以使用设置一个任意属性,而不是在整个请求/响应过滤器链中获得的属性。在响应筛选器中,可以使用
ContainerResponseContext.getProperty(字符串)

下面是一个示例,我希望使用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()));
    }
}
然后您就可以在响应过滤器中获取标题

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