Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查ServletResponse是否包含任何内容_Java_Jsp - Fatal编程技术网

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
,反之亦然。甚至在文件中也有说明。我不确定这是为什么,但我打赌这是一个合理的理由。