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;
}
我们正在使用 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;
}