C
C
cyberorg2014-01-20 10:42:33
Java
cyberorg, 2014-01-20 10:42:33

How to correctly read the content of outputStream into HttpServletResponse?

The input is an object that implements HttpServletResponse.
There is a task to read the contents of outputStream.

I do it like this:

public static String getResponseBody(HttpServletResponse response){
        if(response==null){ throw new IllegalArgumentException("Response cannot be NULL"); }
        String body;
        try{
            OutputStream outputStream = response.getOutputStream(); //здесь выкидывается исключение
            ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
            outputStream.write(byteStream.toByteArray());
            body = byteStream.toString();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return body;
    }

As a result, the following exception is thrown:
java.lang.IllegalStateException: WRITER
  at org.eclipse.jetty.server.Response.getOutputStream(Response.java:691)
  at net.virtalab.erk.mvcpp.logger.ServletTools.getResponseBody(ServletTools.java:56)
  at net.virtalab.erk.mvcpp.logger.RequestLogger.afterCompletion(RequestLogger.java:59)
  at org.springframework.web.servlet.HandlerExecutionChain.triggerAfterCompletion(HandlerExecutionChain.java:167)
  at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1010)
  at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939)
  at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
  at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
  at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
  at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
  at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
  at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
  at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
  at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
  at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
  at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
  at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
  at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
  at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
  at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
  at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
  at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
  at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
  at org.eclipse.jetty.server.Server.handle(Server.java:370)
  at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
  at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)
  at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)
  at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)
  at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
  at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
  at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
  at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
  at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
  at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
  at java.lang.Thread.run(Thread.java:744)


The question is how: correctly extract the contents of outputStream without causing the wrath of the JVM?

Answer the question

In order to leave comments, you need to log in

1 answer(s)
R
Ruslan Lopatin, 2014-01-20
@kyberorg

The OutputStream cannot be read. But the Servlet API provides the ability to filter. Write a filter that replaces the HttpServletResponse and its OutputStream with yours. For example, writing to the buffer. After generating the response, you will be able to read this buffer. The main thing - do not forget to write the data from the buffer to the original HttpServletResponse.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question