检查ServletResponse是否包含任何内容

时间:2014-04-03 15:54:20

标签: java jsp

如何在不调用ServletResponse方法的情况下检查响应(getWriter())是否包含任何内容,例如: G。在过滤器?或者换句话说:如果已经在流中写入内容,则过滤器应该只修改内容:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    // Only do that if there is really some content
    PrintWriter out = response.getWriter();

可能会发生response.getWriter() - 方法稍后可能在代码中的其他位置调用(不在此过滤器中,例如用于文件下载)。在这种情况下,第二次调用将失败,因为流已经打开...

1 个答案:

答案 0 :(得分:1)

一种方法是扩展ServletResponseWrapper并在内部使用CharArrayWriter来编写响应。 CharArrayWriter有一个size()方法,它将返回缓冲区的大小。确保你在过滤器链中传递一个包装好的响应,你应该能够在程序中的任何一点获得大小。

public class LengthAwareServletResponseWrapper extends ServletResponseWrapper {

    private final CharArrayWriter out = new CharArrayWriter();

    public LengthAwareServletResponseWrapper(final ServletResponse response) {
        super(response);
    }

    public int getWrittenContentLength() {
        return out.size();
    }

    @Override
    public PrintWriter getWriter() throws IOException {
        return new PrintWriter(out);
    }
}