如何在不调用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()
- 方法稍后可能在代码中的其他位置调用(不在此过滤器中,例如用于文件下载)。在这种情况下,第二次调用将失败,因为流已经打开...
答案 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);
}
}