JAVA使用HttpLogFilter拦截所有Http请求并打印日志
说明
- 使用lombok注解
@Log4j2完成log注入
- 拦截所有HTTP请求
- 打印内容为header、url、parameter、body、method
源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| @Component @WebFilter(urlPatterns = "/*", filterName = "HttpLogFilter") @Log4j2 public class HttpLogFilter implements Filter {
@Override public void init(FilterConfig filterConfig) {
}
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { HttpServletRequest req = (HttpServletRequest) request; try { CustomRequestWrapper customRequestWrapper = new CustomRequestWrapper(req); Map<String, String> headers = new HashMap<>(); Enumeration<?> headerNames = req.getHeaderNames(); while (headerNames.hasMoreElements()) { String key = (String) headerNames.nextElement(); String value = req.getHeader(key); headers.put(key, value); } String builder = "\nHeaders:" + JSON.toJSONString(headers) + "," + "\nURL:" + req.getRequestURI() + "," + "\nMethod:" + req.getMethod() + "," + "\nParameters:" + JSON.toJSONString(req.getParameterMap()) + "," + "\nBody:" + customRequestWrapper.getRequestBody(); log.info(builder); chain.doFilter(customRequestWrapper, response); } catch (Exception e) { log.error(e.getMessage(), e); } }
@Override public void destroy() {
} }
class CustomRequestWrapper extends HttpServletRequestWrapper {
private final byte[] requestBody;
public CustomRequestWrapper(HttpServletRequest request) { super(request); requestBody = HttpRequestUtil.getRequestBody(request).getBytes(); }
public String getRequestBody() { return new String(requestBody); }
@Override public ServletInputStream getInputStream() { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(requestBody); return new ServletInputStream() { @Override public boolean isFinished() { return false; }
@Override public boolean isReady() { return false; }
@Override public void setReadListener(ReadListener readListener) { }
@Override public int read() { return byteArrayInputStream.read(); } }; }
@Override public BufferedReader getReader() { return new BufferedReader(new InputStreamReader(getInputStream())); } }
class HttpRequestUtil { public static String getRequestBody(HttpServletRequest request) { StringBuilder builder = new StringBuilder(); try (ServletInputStream servletInputStream = request.getInputStream()) { String line; BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(servletInputStream)); while ((line = bufferedReader.readLine()) != null) { builder.append(line.trim()); } } catch (IOException e) { e.printStackTrace(); } return builder.toString(); } }
|