Skip to content

Instantly share code, notes, and snippets.

@calo81
Created March 18, 2012 12:48
Show Gist options
  • Select an option

  • Save calo81/2071634 to your computer and use it in GitHub Desktop.

Select an option

Save calo81/2071634 to your computer and use it in GitHub Desktop.

Revisions

  1. calo81 created this gist Mar 18, 2012.
    97 changes: 97 additions & 0 deletions LoggerFilter
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,97 @@
    package com.paddypower.financials.market.management.rest.logging;

    import java.io.BufferedReader;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;

    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletInputStream;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;

    import org.apache.commons.io.IOUtils;

    public class LoggerFilter implements Filter {

    private Auditor auditor;

    public void destroy() {
    // Nothing to do
    }

    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {
    ResettableStreamHttpServletRequest wrappedRequest = new ResettableStreamHttpServletRequest(
    (HttpServletRequest) request);
    // wrappedRequest.getInputStream().read();
    String body = IOUtils.toString(wrappedRequest.getReader());
    auditor.audit(wrappedRequest.getRequestURI(),wrappedRequest.getUserPrincipal(), body);
    wrappedRequest.resetInputStream();
    chain.doFilter(wrappedRequest, response);

    }

    public void init(FilterConfig arg0) throws ServletException {
    // Nothing to do
    }

    private static class ResettableStreamHttpServletRequest extends
    HttpServletRequestWrapper {

    private byte[] rawData;
    private HttpServletRequest request;
    private ResettableServletInputStream servletStream;

    public ResettableStreamHttpServletRequest(HttpServletRequest request) {
    super(request);
    this.request = request;
    this.servletStream = new ResettableServletInputStream();
    }


    public void resetInputStream() {
    servletStream.stream = new ByteArrayInputStream(rawData);
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
    if (rawData == null) {
    rawData = IOUtils.toByteArray(this.request.getReader());
    servletStream.stream = new ByteArrayInputStream(rawData);
    }
    return servletStream;
    }

    @Override
    public BufferedReader getReader() throws IOException {
    if (rawData == null) {
    rawData = IOUtils.toByteArray(this.request.getReader());
    servletStream.stream = new ByteArrayInputStream(rawData);
    }
    return new BufferedReader(new InputStreamReader(servletStream));
    }


    private class ResettableServletInputStream extends ServletInputStream {

    private InputStream stream;

    @Override
    public int read() throws IOException {
    return stream.read();
    }
    }
    }

    public void setAuditor(Auditor auditor) {
    this.auditor = auditor;
    }

    }