Created
October 27, 2014 14:40
-
-
Save Artem-Mamchych/7d889524f52fae862ec6 to your computer and use it in GitHub Desktop.
HttpLoggerFilter - REST method and params logger
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import org.slf4j.Logger; | |
import org.slf4j.LoggerFactory; | |
import javax.servlet.Filter; | |
import javax.servlet.FilterChain; | |
import javax.servlet.FilterConfig; | |
import javax.servlet.ServletException; | |
import javax.servlet.ServletInputStream; | |
import javax.servlet.ServletOutputStream; | |
import javax.servlet.ServletRequest; | |
import javax.servlet.ServletResponse; | |
import javax.servlet.http.HttpServletRequest; | |
import javax.servlet.http.HttpServletRequestWrapper; | |
import javax.servlet.http.HttpServletResponse; | |
import javax.servlet.http.HttpServletResponseWrapper; | |
import java.io.ByteArrayInputStream; | |
import java.io.ByteArrayOutputStream; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.io.PrintWriter; | |
public class HttpLoggerFilter implements Filter { | |
private final Logger logger = LoggerFactory.getLogger(HttpLoggerFilter.class); | |
private static class ByteArrayServletStream extends ServletOutputStream { | |
ByteArrayOutputStream baos; | |
ByteArrayServletStream(ByteArrayOutputStream baos) { | |
this.baos = baos; | |
} | |
public void write(int param) throws IOException { | |
baos.write(param); | |
} | |
} | |
private static class ByteArrayPrintWriter { | |
private ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |
private PrintWriter pw = new PrintWriter(baos); | |
private ServletOutputStream sos = new ByteArrayServletStream(baos); | |
public PrintWriter getWriter() { | |
return pw; | |
} | |
public ServletOutputStream getStream() { | |
return sos; | |
} | |
byte[] toByteArray() { | |
return baos.toByteArray(); | |
} | |
} | |
private class BufferedServletInputStream extends ServletInputStream { | |
ByteArrayInputStream bais; | |
public BufferedServletInputStream(ByteArrayInputStream bais) { | |
this.bais = bais; | |
} | |
public int available() { | |
return bais.available(); | |
} | |
public int read() { | |
return bais.read(); | |
} | |
public int read(byte[] buf, int off, int len) { | |
return bais.read(buf, off, len); | |
} | |
} | |
private class BufferedRequestWrapper extends HttpServletRequestWrapper { | |
ByteArrayInputStream bais; | |
ByteArrayOutputStream baos; | |
BufferedServletInputStream bsis; | |
byte[] buffer; | |
public BufferedRequestWrapper(HttpServletRequest req) throws IOException { | |
super(req); | |
InputStream is = req.getInputStream(); | |
baos = new ByteArrayOutputStream(); | |
byte buf[] = new byte[1024]; | |
int letti; | |
while ((letti = is.read(buf)) > 0) { | |
baos.write(buf, 0, letti); | |
} | |
buffer = baos.toByteArray(); | |
} | |
public ServletInputStream getInputStream() { | |
try { | |
bais = new ByteArrayInputStream(buffer); | |
bsis = new BufferedServletInputStream(bais); | |
} catch (Exception ex) { | |
ex.printStackTrace(); | |
} | |
return bsis; | |
} | |
public byte[] getBuffer() { | |
return buffer; | |
} | |
} | |
private boolean dumpRequest; | |
private boolean dumpResponse; | |
public void init(FilterConfig filterConfig) throws ServletException { | |
dumpRequest = Boolean.valueOf(filterConfig.getInitParameter("dumpRequest")); | |
dumpResponse = Boolean.valueOf(filterConfig.getInitParameter("dumpResponse")); | |
} | |
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, | |
FilterChain filterChain) throws IOException, ServletException { | |
final HttpServletRequest httpRequest = (HttpServletRequest) servletRequest; | |
BufferedRequestWrapper bufferedRequest = new BufferedRequestWrapper(httpRequest); | |
if (dumpRequest) { | |
logger.info("REQUEST -> " + httpRequest.getMethod() + " " + httpRequest.getRequestURI() + " " + httpRequest.getQueryString() + " " + new String(bufferedRequest.getBuffer())); | |
} | |
final HttpServletResponse response = (HttpServletResponse) servletResponse; | |
final ByteArrayPrintWriter pw = new ByteArrayPrintWriter(); | |
HttpServletResponse wrappedResp = new HttpServletResponseWrapper(response) { | |
public PrintWriter getWriter() { | |
return pw.getWriter(); | |
} | |
public ServletOutputStream getOutputStream() { | |
return pw.getStream(); | |
} | |
}; | |
filterChain.doFilter(bufferedRequest, wrappedResp); | |
byte[] bytes = pw.toByteArray(); | |
response.getOutputStream().write(bytes); | |
if (dumpResponse) { | |
String contentType = response.getContentType(); | |
if (contentType.equals("application/json")) { | |
logger.info("RESPONSE [" + contentType + "] -> " + new String(bytes)); | |
} else { | |
logger.info("RESPONSE [" + contentType + "] -> " + bytes.length + " bytes of data"); | |
} | |
} | |
} | |
public void destroy() { | |
} | |
} | |
/* | |
<!--Filter for logging http request data--> | |
<filter> | |
<filter-name>DumpFilter</filter-name> | |
<filter-class>com.example.HttpLoggerFilter</filter-class> | |
<init-param> | |
<param-name>dumpRequest</param-name> | |
<param-value>true</param-value> | |
</init-param> | |
<init-param> | |
<param-name>dumpResponse</param-name> | |
<param-value>true</param-value> | |
</init-param> | |
</filter> | |
<filter-mapping> | |
<filter-name>DumpFilter</filter-name> | |
<url-pattern>/service/*</url-pattern> | |
</filter-mapping> | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment