Thanks Ben!
> Heres what I have put together, use at your own risk. any comments
> welcome.
>
> HttpServletResponseLoggingFilter.java
>
> public class HttpServletResponseLoggingFilter implements Filter
> {
> private Logger mLogger =
> Logger.getLogger(HttpServletResponseLoggingFilter.class);
>
> public void doFilter(ServletRequest servletRequest,
> ServletResponse servletResponse, FilterChain filterChain) throws
> IOException, ServletException
> {
> if ( mLogger.isDebugEnabled() && servletResponse instanceof
> HttpServletResponse &&
> isNonStaticResource((HttpServletRequest)servletRequest) )
> {
> final LoggingHttpServletResponse
> loggingHttpServletResponse = new
> LoggingHttpServletResponse((HttpServletResponse)servletResponse);
>
> try
> {
> mLogger.debug("Filtering request : " +
> getFullRequestUrl((HttpServletRequest)servletRequest));
>
> filterChain.doFilter(servletRequest,
> loggingHttpServletResponse);
> }
> finally
> {
> loggingHttpServletResponse.finishResponse();
> }
> }
> else
> {
> filterChain.doFilter(servletRequest, servletResponse);
> }
> }
>
> private boolean isNonStaticResource(HttpServletRequest request)
> {
> return !request.getRequestURI().contains("resources");
> }
>
> // http://hostname.com/mywebapp/servlet/MyServlet/a/b;c=123?d=789
> private String getFullRequestUrl(HttpServletRequest request)
> {
> String reqUrl = request.getRequestURL().toString();
> String queryString = request.getQueryString(); // d=789
> if (queryString != null)
> {
> reqUrl += "?"+queryString;
> }
> return reqUrl;
> }
>
> public void init(FilterConfig filterConfig) throws ServletException
> {
> }
>
> public void destroy()
> {
> }
>
> }
>
> LoggingHttpServletResponse.java
>
> class LoggingHttpServletResponse extends HttpServletResponseWrapper
> {
> private Logger mLogger =
> Logger.getLogger(LoggingHttpServletResponse.class);
>
> public LoggingHttpServletResponse(HttpServletResponse
> httpServletResponse)
> {
> super(httpServletResponse);
> mWrappedResponse = httpServletResponse;
> }
>
> // ----------------------------------------------------- Instance
> Variables
>
> /**
> * Original response
> */
>
> protected HttpServletResponse mWrappedResponse = null;
>
> /**
> * The ServletOutputStream that has been returned by
> * <code>getOutputStream()</code>, if any.
> */
>
> protected ServletOutputStream mStream = null;
>
>
> /**
> * The PrintWriter that has been returned by
> * <code>getWriter()</code>, if any.
> */
>
> protected PrintWriter mWriter = null;
>
> // --------------------------------------------------------- Public
> Methods
>
> /**
> * Create and return a ServletOutputStream to write the content
> * associated with this Response.
> *
> * @throws IOException if an input/output error occurs
> */
> public ServletOutputStream createOutputStream() throws IOException
> {
> mLogger.debug("Creating new LoggingOutputStream");
>
> return new LoggingServletOutputStream(mWrappedResponse, mLogger);
> }
>
>
> /**
> * Finish a response.
> */
> public void finishResponse()
> {
> try
> {
> if (mWriter != null)
> {
> mWriter.close();
> }
> else
> {
> if (mStream != null)
> mStream.close();
> }
> }
> catch (IOException e)
> {
> }
> }
>
> // ------------------------------------------------ ServletResponse
> Methods
>
>
> /**
> * Flush the buffer and commit this response.
> *
> * @throws IOException if an input/output error occurs
> */
> public void flushBuffer() throws IOException
> {
> mStream.flush();
> }
>
> /**
> * Return the servlet output mStream associated with this Response.
> *
> * @throws IllegalStateException if <code>getWriter</code> has
> * already been called for this response
> * @throws IOException if an input/output error occurs
> */
> public ServletOutputStream getOutputStream() throws IOException
> {
> if (mWriter != null)
> throw new IllegalStateException("getWriter() has already
> been called for this response");
>
> if (mStream == null)
> mStream = createOutputStream();
>
> mLogger.debug("mStream is set to " + mStream + " in
> getOutputStream");
>
> return (mStream);
> }
>
> /**
> * Return the mWriter associated with this Response.
> *
> * @throws IllegalStateException if <code>getOutputStream</code> has
> * already been called for this response
> * @throws IOException if an input/output error occurs
> */
> public PrintWriter getWriter() throws IOException
> {
> if (mWriter != null)
> return (mWriter);
>
> if (mStream != null)
> throw new IllegalStateException("getOutputStream() has
> already been called for this response");
>
> mStream = createOutputStream();
>
> mLogger.debug("mStream is set to " + mStream + " in
> getOutputStream");
>
> // HttpServletResponse.getCharacterEncoding() shouldn't return
> null
> // according the spec, so feel free to remove that "if"
> mWriter = new PrintWriter(mStream);
>
> return (mWriter);
> }
>
> }
>
> LoggingServletOutputStream.java
>
> class LoggingServletOutputStream extends ServletOutputStream
> {
> private Logger mLogger;
> private HttpServletResponse mResponse;
> private OutputStream mOutputStream;
> private ByteArrayOutputStream mByteArrayOutputStream = new
> ByteArrayOutputStream();
>
> public LoggingServletOutputStream(HttpServletResponse response,
> Logger logger) throws IOException
> {
> mResponse = response;
> mOutputStream = mResponse.getOutputStream();
> mLogger = logger;
> }
>
> public void write(int b) throws IOException
> {
> mByteArrayOutputStream.write(b);
> mOutputStream.write(b);
> }
>
> @Override
> public void write(byte b[]) throws IOException
> {
> mByteArrayOutputStream.write(b);
> mOutputStream.write(b);
> }
>
> @Override
> public void write(byte b[], int off, int len) throws IOException
> {
> mByteArrayOutputStream.write(b, off, len);
> mOutputStream.write(b, off, len);
> }
>
> @Override
> public void close() throws IOException
> {
> if ( mLogger.isDebugEnabled() )
> {
> float kBytes = mByteArrayOutputStream.size() / 1024f;
>
> mLogger.debug("Writing " + kBytes + " kb (" +
> mByteArrayOutputStream.size() +" b) to the client.\n" +
> mByteArrayOutputStream.toString());
> }
>
> mByteArrayOutputStream = null;
> mOutputStream.close();
> }
>
> @Override
> public void flush() throws IOException
> {
> mOutputStream.flush();
> }
> }
>
> web.xml Snippit..
>
> <filter>
> <filter-name>Logging Filter</filter-name>
>
> <filter-class>com.nexusalpha.journeycheck.presentation.debug.HttpServletResponseLoggingFilter</filter-class>
> </filter>
>
> <filter-mapping>
> <filter-name>Logging Filter</filter-name>
> <url-pattern>/*</url-pattern>
> </filter-mapping>
>
>
>
>
>
>
>
> On 7/24/07, ben short <[EMAIL PROTECTED]> wrote:
>> Yes sure.
>>
>> On 7/24/07, Karel V Sedlacek <[EMAIL PROTECTED]> wrote:
>> > Ben,
>> >
>> > When you succeed at this would you pass along your code? We have
>> issues
>> > with timeouts and it would be great to see what's being passed along
>> to
>> > the client.
>> >
>> > Karel
>> > Cornell University
>> >
>> > > Yes from the CompressionServletResponseWrapper example I can see the
>> > > methods I need to override as you have pointed out.
>> > >
>> > > On 7/24/07, Tim Funk <[EMAIL PROTECTED]> wrote:
>> > >> Yes - but tomcat doesn't have that functionality out of the box -
>> you'd
>> > >> need to write a filter which creates a HttpServletRequestWrapper
>> which
>> > >> overrides getOutputStream() (or getWriter()) and then passes back a
>> > >> wrapped OutStream or Writer which also logs to wherever when
>> print(int
>> > >> i) is called.
>> > >>
>> > >> -Tim
>> > >>
>> > >> ben short wrote:
>> > >> > Hi Tim,
>> > >> >
>> > >> > Thanks for that, but it only seems to log out the
>> request/response
>> > >> > headers. Is It possible to log everything sent to the client?
>> > >> >
>> > >> > Ben
>> > >> >
>> > >> > On 7/24/07, Tim Funk <[EMAIL PROTECTED]> wrote:
>> > >> >> Look at the RequestDumperValve
>> > >> >>
>> > >> >> -Tim
>> > >> >>
>> > >> >> ben short wrote:
>> > >> >> > Hi,
>> > >> >> >
>> > >> >> > I using Tomcat 6.0.13 and Spring 2.0.6. I have been involved
>> in
>> > >> >> > developing a website that products pages in various formats ,
>> such
>> > >> as
>> > >> >> > www, xml, wap and pda. We are having some issues with wap and
>> pda,
>> > >> but
>> > >> >> > cant ciew the html source thats being shown on the devices.
>> > >> >> > We can view the html source in firefox using a wap and pda
>> plugin,
>> > >> but
>> > >> >> > the issues are not always the same or there at all.
>> > >> >> >
>> > >> >> > What I would like to do is log all the data sent to the
>> client. I
>> > >> have
>> > >> >> > been looking at encapsulating the HttpServletRequest and log
>> out
>> > >> the
>> > >> >> > data to a log file.
>> > >>
>> > >> ---------------------------------------------------------------------
>> > >> To start a new topic, e-mail: [email protected]
>> > >> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> > >> For additional commands, e-mail: [EMAIL PROTECTED]
>> > >>
>> > >>
>> > >
>> > > ---------------------------------------------------------------------
>> > > To start a new topic, e-mail: [email protected]
>> > > To unsubscribe, e-mail: [EMAIL PROTECTED]
>> > > For additional commands, e-mail: [EMAIL PROTECTED]
>> > >
>> > >
>> >
>> >
>> >
>> > ---------------------------------------------------------------------
>> > To start a new topic, e-mail: [email protected]
>> > To unsubscribe, e-mail: [EMAIL PROTECTED]
>> > For additional commands, e-mail: [EMAIL PROTECTED]
>> >
>> >
>>
>
> ---------------------------------------------------------------------
> To start a new topic, e-mail: [email protected]
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
---------------------------------------------------------------------
To start a new topic, e-mail: [email protected]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]