[转]在filter中打印HttpSevletResponse的body

源地址stackoverflow
基本思想:使用HttpServletResponseWrapper复制body内容

Filter代码

@WebFilter("/*")
public class ResponseLogger implements Filter {

@Override
public void init(FilterConfig config) throws ServletException {
    // NOOP.
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    if (response.getCharacterEncoding() == null) {
        response.setCharacterEncoding("UTF-8"); // Or whatever default. UTF-8 is good for World Domination.
    }

    HttpServletResponseCopier responseCopier = new HttpServletResponseCopier((HttpServletResponse) response);

    try {
        chain.doFilter(request, responseCopier);
        responseCopier.flushBuffer();
    } finally {
        byte[] copy = responseCopier.getCopy();
        System.out.println(new String(copy, response.getCharacterEncoding())); // Do your logging job here. This is just a basic example.
    }
}

@Override
public void destroy() {
    // NOOP.
}

}

HttpServletResponseWrapper代码

public class HttpServletResponseCopier extends HttpServletResponseWrapper {

private ServletOutputStream outputStream;
private PrintWriter writer;
private ServletOutputStreamCopier copier;

public HttpServletResponseCopier(HttpServletResponse response) throws IOException {
    super(response);
}

@Override
public ServletOutputStream getOutputStream() throws IOException {
    if (writer != null) {
        throw new IllegalStateException("getWriter() has already been called on this response.");
    }

    if (outputStream == null) {
        outputStream = getResponse().getOutputStream();
        copier = new ServletOutputStreamCopier(outputStream);
    }

    return copier;
}

@Override
public PrintWriter getWriter() throws IOException {
    if (outputStream != null) {
        throw new IllegalStateException("getOutputStream() has already been called on this response.");
    }

    if (writer == null) {
        copier = new ServletOutputStreamCopier(getResponse().getOutputStream());
        writer = new PrintWriter(new OutputStreamWriter(copier, getResponse().getCharacterEncoding()), true);
    }

    return writer;
}

@Override
public void flushBuffer() throws IOException {
    if (writer != null) {
        writer.flush();
    } else if (outputStream != null) {
        copier.flush();
    }
}

public byte[] getCopy() {
    if (copier != null) {
        return copier.getCopy();
    } else {
        return new byte[0];
    }
}

}

ServletOutputStream代码

public class ServletOutputStreamCopier extends ServletOutputStream {

private OutputStream outputStream;
private ByteArrayOutputStream copy;

public ServletOutputStreamCopier(OutputStream outputStream) {
    this.outputStream = outputStream;
    this.copy = new ByteArrayOutputStream(1024);
}

@Override
public void write(int b) throws IOException {
    outputStream.write(b);
    copy.write(b);
}

public byte[] getCopy() {
    return copy.toByteArray();
}

}
posted @ 2017-10-17 22:40  linden5  阅读(337)  评论(0编辑  收藏  举报