package com.himo.Filter;
import com.alibaba.fastjson.JSON;
import org.apache.logging.log4j.ThreadContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Map;
import java.util.UUID;
/**
* 作者:修羅大人
* 時間:2018-11-15 16:46
* 描述:日志過濾器
*/
@Component
@WebFilter(filterName ="logFilter", urlPatterns ="/*")
public class LogFilterimplements Filter {
private Loggerlogger = LoggerFactory.getLogger(this.getClass());
private static final StringignoreUrlRegex =".*((pay/)|(/index)|(/index/.*)|([.]((html)|(jsp)|(css)|(js)|(gif)|(png))))$";
@Override
? ? public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {
ThreadContext.put("TId", UUID.randomUUID().toString());
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 請求html頁面、js不打印日志
? ? ? ? if (httpServletRequest.getRequestURI().matches(ignoreUrlRegex)) {
ThreadContext.clearAll();
filterChain.doFilter(servletRequest,servletResponse);
return;
}
HttpServletRequest request = (HttpServletRequest) servletRequest;
logger.info("url: " + request.getRequestURL());//url
? ? ? ? logger.info("ip: " + request.getRemoteHost());//ip
? ? ? ? logger.info("method: "+request.getMethod());//post or get? or ?
? ? ? ? Map parameterMap = request.getParameterMap();
logger.warn("請求url參數(shù):" + JSON.toJSONString(parameterMap));
try {
ServletInputStream inputStream = request.getInputStream();
int len = request.getContentLength();
if (len >0)
{
byte[] bytes =new byte[len];
int i =0;
ByteArrayOutputStream bo =new ByteArrayOutputStream();
inputStream.read(bytes,i,len);
bo.write(bytes,i,len);
bo.flush();
bo.close();
String result = bo.toString();
logger.warn("請求體參數(shù)" + result);
}
}catch (IOException e) {
e.printStackTrace();
}
HttpServletResponse resp = (HttpServletResponse) servletResponse;
ResponseWrapper mResp =new ResponseWrapper(resp);// 包裝響應(yīng)對象 resp 并緩存響應(yīng)數(shù)據(jù)
? ? ? ? filterChain.doFilter(request, mResp);
byte[] bytes = mResp.getBytes();// 獲取緩存的響應(yīng)數(shù)據(jù)
? ? ? ? if (bytes.length >0)
{
String responseStr =new String(bytes);
logger.warn("返回值:" + responseStr);
}
//? ? ? ? System.out.println("壓縮前大?。? + bytes.length);
//? ? ? ? System.out.println("壓縮前數(shù)據(jù):" + new String(bytes,"utf-8"));
//? ? ? ? ByteArrayOutputStream bout = new ByteArrayOutputStream();
//? ? ? ? GZIPOutputStream gzipOut = new GZIPOutputStream(bout); // 創(chuàng)建 GZIPOutputStream 對象
//? ? ? ? gzipOut.write(bytes); // 將響應(yīng)的數(shù)據(jù)寫到 Gzip 壓縮流中
//? ? ? ? gzipOut.flush();
//? ? ? ? gzipOut.close(); // 將數(shù)據(jù)刷新到? bout 字節(jié)流數(shù)組
//? ? ? ? byte[] bts = bout.toByteArray();
//? ? ? ? System.out.println("壓縮后大?。? + bts.length);
//? ? ? ? resp.setHeader("Content-Encoding", "gzip"); // 設(shè)置響應(yīng)頭信息
//? ? ? ? resp.getOutputStream().write(bts); // 將壓縮數(shù)據(jù)響應(yīng)給客戶端
? ? }
@Override
? ? public void init(FilterConfig filterConfig)throws ServletException {
}
@Override
? ? public void destroy() {
}
}
package com.himo.Filter;
/**
* 作者:修羅大人
* 時間:2018-11-15 17:13
* 描述:ResponseWrapper
*/
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.*;
public class ResponseWrapperextends HttpServletResponseWrapper {
private ByteArrayOutputStreambytes =new ByteArrayOutputStream();
private HttpServletResponseresponse;
private PrintWriterpwrite;
public ResponseWrapper(HttpServletResponse response) {
super(response);
this.response = response;
}
@Override
? ? public ServletOutputStream getOutputStream()throws IOException {
return new MyServletOutputStream(bytes);// 將數(shù)據(jù)寫到 byte 中
? ? }
/**
* 重寫父類的 getWriter () 方法,將響應(yīng)數(shù)據(jù)緩存在 PrintWriter 中
*/
? ? @Override
? ? public PrintWriter getWriter()throws IOException {
try {
pwrite =new PrintWriter(new OutputStreamWriter(bytes,"utf-8"));
}catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return pwrite;
}
/**
* 獲取緩存在 PrintWriter 中的響應(yīng)數(shù)據(jù)
*
? ? * @return
? ? */
? ? public byte[] getBytes() {
if (null !=pwrite) {
pwrite.close();
return bytes.toByteArray();
}
if (null !=bytes) {
try {
bytes.flush();
}catch (IOException e) {
e.printStackTrace();
}
}
return bytes.toByteArray();
}
class MyServletOutputStreamextends ServletOutputStream {
private ByteArrayOutputStreamostream;
public MyServletOutputStream(ByteArrayOutputStream ostream) {
this.ostream = ostream;
}
@Override
? ? ? ? public void write(int b)throws IOException {
ostream.write(b);// 將數(shù)據(jù)寫到 stream 中
? ? ? ? }
@Override
? ? ? ? public boolean isReady() {
return false;
}
@Override
? ? ? ? public void setWriteListener(WriteListener writeListener) {
}
}
}