Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Take a look at <a href="http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponseWrapper.html" rel="nofollow">HttpServletResponseWrapper</a>.</p> <hr> <p><em><strong>Okay, then code:</em></strong></p> <p>This code buffers the output (in two fashions) so adding the header after the pseudo-output works. Actually addHeader could have been implemented by outputting, so we are <em>lucky</em> it works. Border-case code. If unlucky, addHeader would have to be overriden.</p> <p>Mind, when I tried, only getOutputStream was called in my test app. There is a choice to be made either electing getPrintWriter or getOutputStream.</p> <pre><code>private static class PostponingResponseWrapper extends HttpServletResponseWrapper { private ByteArrayOutputStream bos; private ServletOutputStream outputStream; private StringWriter sw; private PrintWriter printWriter; private boolean usingOutputStream; private boolean usingWriter; public PostponingResponseWrapper (HttpServletResponse response) { super(response); bos = new ByteArrayOutputStream(); outputStream = new ServletOutputStream() { @Override public void write(int b) throws IOException { bos.write(b); } }; sw = new StringWriter(); printWriter = new PrintWriter(sw); } @Override public PrintWriter getWriter() throws IOException { usingWriter = true; LOGGER.info("getWriter usingWriter {}, usingOutputStream {}", usingWriter, usingOutputStream); return printWriter; } @Override public void flushBuffer() throws IOException { LOGGER.info("flushBuffer"); } @Override public ServletOutputStream getOutputStream() throws IOException { usingOutputStream = true; LOGGER.info("getOutputStream usingWriter {}, usingOutputStream {}", usingWriter, usingOutputStream); ServletOutputStream out = new ServletOutputStream() { @Override public void write(int b) throws IOException { outputStream.write(b); } }; return out; } public void finish() throws IOException { LOGGER.info("finish"); if (usingWriter) { super.getWriter().print(sw.toString()); } else if (usingOutputStream) { super.getOutputStream().write(bos.toByteArray()); } } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse httpServletResponse = (HttpServletResponse) response; PostponingResponseWrapper responseWrapper = new PostponingResponseWrapper (httpServletResponse); responseWrapper.addHeader("Before", "Already-Worked"); chain.doFilter(request, responseWrapper); responseWrapper.addHeader("After", "And-Now-This"); responseWrapper.finish(); // Writes the actual response } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload