package cn.stylefeng.guns.utils;
|
|
import cn.hutool.core.io.FileUtil;
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.json.JSONUtil;
|
import com.google.common.collect.ImmutableSet;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Component;
|
import org.springframework.web.util.ContentCachingRequestWrapper;
|
import org.springframework.web.util.ContentCachingResponseWrapper;
|
|
import javax.servlet.*;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.IOException;
|
import java.nio.charset.StandardCharsets;
|
import java.util.Enumeration;
|
import java.util.HashMap;
|
import java.util.Map;
|
import java.util.Set;
|
import java.util.stream.Collectors;
|
|
/**
|
* 调试请求日志过滤器
|
*
|
* @author goupan
|
*/
|
@Slf4j
|
@Component
|
public class ReqDebugUtil implements Filter {
|
|
private static final ImmutableSet<String> IGNORED_HEADERS;
|
|
static {
|
Set<String> ignoredHeaders = ImmutableSet.of(
|
"Content-Type",
|
"User-Agent",
|
"Accept",
|
"Cache-Control",
|
"Postman-Token",
|
"Host",
|
"Accept-Encoding",
|
"Connection",
|
"Content-Length")
|
.stream()
|
.map(String::toUpperCase)
|
.collect(Collectors.toSet());
|
IGNORED_HEADERS = ImmutableSet.copyOf(ignoredHeaders);
|
}
|
|
@Override
|
public void init(FilterConfig filterConfig) throws ServletException {
|
// 通过filterConfig获取初始化参数
|
log.info("调试请求日志过滤器 init..");
|
}
|
|
@Override
|
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
|
HttpServletRequest request = (HttpServletRequest) servletRequest;
|
HttpServletResponse response = (HttpServletResponse) servletResponse;
|
ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request);
|
ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response);
|
|
try {
|
filterChain.doFilter(requestWrapper, responseWrapper);
|
} finally {
|
try {
|
// 请求地址
|
String url = request.getRequestURL().toString();
|
if (StrUtil.isBlank(FileUtil.getSuffix(url))
|
&& !url.contains("/doc.html")
|
&& !url.contains("/swagger")
|
&& !url.contains("/webjars")
|
&& !url.contains("/api-docs")
|
) {
|
// 构造header
|
Map header = new HashMap(16);
|
Enumeration<String> headerNames = request.getHeaderNames();
|
while (headerNames.hasMoreElements()) {
|
String headerName = headerNames.nextElement();
|
if (!IGNORED_HEADERS.contains(headerName.toUpperCase())) {
|
header.put(headerName, request.getHeader(headerName));
|
}
|
}
|
|
log.info(
|
// System.out.println(
|
"请求url: " + url + " method: " + request.getMethod()
|
+ "\nheader: " + JSONUtil.toJsonStr(header)
|
+ "\nparams: " + request.getQueryString()
|
+ "\nreqBody: " + new String(requestWrapper.getContentAsByteArray(), StandardCharsets.UTF_8)
|
+ "\nrepData: " + new String(responseWrapper.getContentAsByteArray(), StandardCharsets.UTF_8)
|
);
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
} finally {
|
// 这一行必须添加,否则就一直不返回
|
responseWrapper.copyBodyToResponse();
|
}
|
}
|
}
|
|
@Override
|
public void destroy() {
|
|
}
|
}
|