我怎样才能读取一个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适当的最终响应。 以这种方式,你永远不会修改多个响应对象或需要从中读取。
我知道这不是一个直接的答案,但是我就是这么做的。