多次调用HttpServletResponseWrapper中的getOutputStream

时间:2015-04-18 06:26:03

标签: java servlets servlet-filters outputstream weblogic11g

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

1 个答案:

答案 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;
}