如何读取HttpServletReponses输出流?

时间:2009-03-31 15:49:56

标签: java http servlets

我想创建一个Servlet过滤器,它将在处理完成后读取Response的内容,并以XML或PDF或其他方式返回该信息。但我不知道如何从HttpServletResponse对象中获取任何信息。我怎样才能获得这些信息?

4 个答案:

答案 0 :(得分:29)

将其添加到过滤器java文件中。

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();

内容变量现在具有输出流。您也可以为二进制内容执行此操作。

答案 1 :(得分:3)

Spring现在有它的功能。您需要做的就是使用[ContentCachingResponseWrapper],它有方法public byte [] getContentAsByteArray()。

我建议制作WrapperFactory,使其可以配置,无论是使用默认的ResponseWrapper还是ContentCachingResponseWrapper。

答案 2 :(得分:1)

我不太清楚你可以从HttpServletResponse对象中获取数据。构造应用程序可能更有意义,以便将请求代理到适当的处理程序并传递给数据传输对象,从中可以构建适当的最终响应。通过这种方式,您永远不会修改多个响应对象或需要从中读取。

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

答案 3 :(得分:1)

我认为你不一定能这样做,因为写入输出流可能会导致在填充后调用任何servlet过滤器之前将数据刷新到客户端。正如 iftrue 建议的那样,建议使用不同的架构来生成XML(比如说),然后以您想要的任何输出格式重新生成。

编辑:阅读了对 iftrue 发布的回复后,如果你真的不能干扰当前的处理,也许你需要一个servlet代理你的请求,从原始输出捕获输出,然后适当地munge。但是非常讨厌: - (

相关问题