原因是在我们伪造的响应(`CachedHttpServletResponse` ),覆写了getWriter();,只能获取一次,在模板引擎渲染时,需要再次获取writer()。
我的解决方法是,将Pritwer和ServletOutpuStream存一个副本到CachedHttpServletResponse中,在构造方法时,初始化这两个值。
public class CachedHttpServletResponseBackup extends HttpServletResponseWrapper { private ByteArrayOutputStream output = new ByteArrayOutputStream();// private boolean open = false; private PrintWriter cacheWriter; private ServletOutputStream cacheOut; public CachedHttpServletResponseBackup(HttpServletResponse response) throws UnsupportedEncodingException { super(response); cacheOut = new ServletOutputStream() { @Override public boolean isReady() { return true; } @Override public void setWriteListener(WriteListener writeListener) { } @Override public void write(int b) throws IOException { output.write(b); } }; cacheWriter = new PrintWriter(output, false); } @Override public PrintWriter getWriter() { return cacheWriter; } @Override public ServletOutputStream getOutputStream() throws IOException { return cacheOut; } public byte[] getContent(){ return output.toByteArray(); }}
对应的CacheFilter中也要修改成CachedHttpServletResponseBackup
Sign in to make a reply
某同学
原因是在我们伪造的响应(`CachedHttpServletResponse` ),覆写了getWriter();,只能获取一次,在模板引擎渲染时,需要再次获取writer()。
我的解决方法是,将Pritwer和ServletOutpuStream存一个副本到CachedHttpServletResponse中,在构造方法时,初始化这两个值。
对应的CacheFilter中也要修改成CachedHttpServletResponseBackup