我们正在使用servlet过滤器在返回之前将字符串注入响应中。我们正在使用HttpServletResponseWrapper
的实现来执行此操作。包装类是从`doFilter()方法调用的:
chain.doFilter(request, responseWrapper);
我们ResponseWrapper
课程的代码片段是:
@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。
答案 0 :(得分:0)
所以你做错了。只要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;
}