HttpServletResponseWrapper 中的 getOutputStream 被多次调用

getOutputStream in HttpServletResponseWrapper getting called multiple times

我们正在使用 servlet 过滤器在返回之前将字符串注入到响应中。我们正在使用 HttpServletResponseWrapper 的实现来做到这一点。包装器 class 从 `doFilter() 方法调用:

chain.doFilter(request, responseWrapper);

我们 ResponseWrapper class 的代码片段是:

@Override
public ServletOutputStream getOutputStream()
throws IOException
{
String theString = "someString";
// Get a reference to the superclass's outputstream.    
ServletOutputStream stream = super.getOutputStream();       

// Create a new string with the proper encoding as defined
// in the server.

String s = new String(theString.getBytes(), 0, theString.length(), response.getCharacterEncoding());

// Inject the string
stream.write(s.getBytes());

return stream;
}

在某些服务器实例中,stream.write(s.getBytes()) 方法会导致 getOutputStream() 方法被多次调用。这会导致字符串在响应中被多次注入。

当最终输出显示为jsp时,字符串在UI中出现多次。

我们正在使用 WebLogic Server 11g。

所以你做错了。 getOutputStream() 被多次调用是完全可以的,只要 getWriter() 没有被调用。您应该通过将输出流管理为单例来注入一次字符串:

ServletOutputStream outputStream; // an instance member of your Wrapper

@Override
public synchronized ServletOutputStream getOutputStream()
throws IOException
{

    if (outputStream == null)
    {
        outputStream = super.getOutputStream();
        outputStream.write(/*your injected stuff*/);
    }
    return outputStream;
}