我怎样才能读取一个HttpServletReponses输出stream?

我想创build一个Servletfilter,它将在处理完成之后读取Response的内容,并以XML或PDF或其他方式返回该信息。 但是我不确定如何从HttpServletResponse对象中获取任何信息。 我怎样才能得到这些信息?

将其添加到filterjava文件。

static class MyHttpServletResponseWrapper extends HttpServletResponseWrapper { private StringWriter sw = new StringWriter(BUFFER_SIZE); public MyHttpServletResponseWrapper(HttpServletResponse response) { super(response); } public PrintWriter getWriter() throws IOException { return new PrintWriter(sw); } public ServletOutputStream getOutputStream() throws IOException { throw new UnsupportedOperationException(); } public String toString() { return sw.toString(); } } 

使用以下代码:

 HttpServletResponse httpResponse = (HttpServletResponse) response; MyHttpServletResponseWrapper wrapper = new MyHttpServletResponseWrapper(httpResponse); chain.doFilter(request, wrapper); String content = wrapper.toString(); 

内容variables现在具有输出stream。 你也可以做二进制内容。

spring现在有它的function。 所有你需要做的就是使用[ContentCachingResponseWrapper],它具有方法public byte [] getContentAsByteArray()。

我build议使WrapperFactory将允许使其可configuration,无论是使用默认的ResponseWrapper或ContentCachingResponseWrapper。

我不相信你可能会这样做,因为写入输出stream可能导致数据在任何servletfilter被调用后被刷新到客户端。 如果真是这样那么build议使用不同的体系结构,以生成XML(例如),然后以您希望的任何输出格式重新生成。

编辑:如果你真的不能干涉当前的处理过程,读过你对iftrue的发布的回应,也许你需要一个servlet代理你的请求,从原始输出捕获输出,然后根据情况select。 非常讨厌,但是:-(

我不知道你可以从HttpServletResponse对象中获取数据。 将应用程序结构化可能更有意义,这样请求将被代理到适当的处理程序,并通过数据传输对象传递,从而可以构build适当的最终响应。 以这种方式,你永远不会修改多个响应对象或需要从中读取。

我知道这不是一个直接的答案,但是我就是这么做的。