Discuss / Java / 在使用pebble模板引擎当中 ,会再次调用 getWriter(),会抛出异常。

在使用pebble模板引擎当中 ,会再次调用 getWriter(),会抛出异常。

Topic source

某同学

#1 Created at ... [Delete] [Delete and Lock User]

原因是在我们伪造的响应(`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


  • 1

Reply