Java 检查ServletResponse是否包含任何内容
如何检查响应(Java 检查ServletResponse是否包含任何内容,java,jsp,Java,Jsp,如何检查响应(ServletResponse)是否包含任何内容,而不调用getWriter()-方法,例如。G在过滤器里?或者换句话说:如果流中已经写入了内容,则过滤器只应修改内容: public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Only do that if there
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()
-方法(不在该筛选器中,例如用于文件下载)。在这种情况下,第二个调用将失败,因为流已经打开…一种方法是扩展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);
}
}
事实上,我不太明白,只要流没有关闭,就不能对response对象调用两次getWriter。为什么不可能呢?我不知道你说的不能给getWriter打两次电话是什么意思。是否引发异常?我更正:我无法在同一响应上调用getwriter()和getOutputStream()(如果我没有记错的话,会导致非法状态异常),我不太明白为什么…一旦调用
getwriter
,就不能调用getOutputStream
,反之亦然。甚至在文件中也有说明。我不确定这是为什么,但我打赌这是一个合理的理由。