@Component
@Slf4j
public class KylinFilter extends OncePerRequestFilter {
public static final String TRACE_ID = "X-B3-TraceId";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
log.info("doFilter start ");
//防止读取一次问题
//request = new RequestWrapper(request);
//response = new ResponseWrapper(response);
KylinLog kylinLog = new KylinLog();
try {
filterChain.doFilter(request, response);
} finally {
assembleKylinLog(request, (ResponseWrapper)response,kylinLog);
}
log.info("doFilter end ");
}
private void assembleKylinLog(HttpServletRequest request, ResponseWrapper response, KylinLog kylinLog) {
String traceId = findTraceId(request);
kylinLog.setTraceId(traceId);
kylinLog.setMethod(request.getMethod());
kylinLog.setUrl(request.getRequestURL().toString());
kylinLog.setCurrService(request.getContextPath());
if (request instanceof RequestWrapper && !isMultipart(request) && !isBinaryContent(request)) {
RequestWrapper requestWrapper = (RequestWrapper) request;
//请求参数
String data = "";
if(requestWrapper.getMethod().toUpperCase().equals("POST")){
data = getRequestPostBody(requestWrapper);
}
kylinLog.setRequest(data);
//返回参数
String responseBody = "";
try {
String charEncoding = requestWrapper.getCharacterEncoding() != null ? requestWrapper.getCharacterEncoding() : "UTF-8";
responseBody = new String(response.toByteArray(), charEncoding);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
kylinLog.setResponse(responseBody);
log.info("-------------------------------------------------------"+ JSONObject.toJSONString(kylinLog));
}
}
//request中获取traceId
public String findTraceId(HttpServletRequest request) {
String traceId = request.getHeader(TRACE_ID);
if (StringUtils.isEmpty(traceId)) {
//DONE 如果traceId为空,则从当前项目创建traceId 后期使用同一的util 工具进行封装流水号的产生
traceId = getSystemTimeFormatMillis() + get16UUID();
}
return traceId;
}
public Map<String, Object> getHeaders() {
Map<String, Object> headerMap = new HashMap<String, Object>();
Enumeration<?> er = request.getHeaderNames();//获取请求头的所有name值
String headerName;
while(er.hasMoreElements()){
headerName = er.nextElement().toString();
headerMap.put(headerName, request.getHeader(headerName));
}
return headerMap;
}
//request中获取post参数
private String getRequestPostBody(HttpServletRequest request) {
BufferedReader reader = null;
String wholeStr = "";
try {
reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
String str = "";
while((str = reader.readLine()) != null){//一行一行的读取body体里面的内容;
wholeStr += str;
}
} catch (IOException e) {
e.printStackTrace();
}
return wholeStr;
}
java Filter从Request,Response获取traceId,请求,返回参数
最新推荐文章于 2023-09-12 13:44:58 发布