package com.java110.core.trace; import com.alibaba.fastjson.JSONObject; import com.java110.core.log.LoggerFactory; import com.java110.dto.trace.TraceAnnotationsDto; import org.slf4j.Logger; import org.springframework.stereotype.Component; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; /** * 所有请求 调用链 拦截 * Created by wuxw on 2018/5/2. */ @Component public class Java110TraceHandlerInterceptor extends HandlerInterceptorAdapter { private static Logger logger = LoggerFactory.getLogger(Java110TraceHandlerInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.debug("进入拦截器Java110TraceHandlerInterceptor>>preHandle"); // 获取组件名称 和方法名称 String url = request.getRequestURI() != null ? request.getRequestURI() : ""; Map headers = new HashMap<>(); Enumeration reqHeaderEnum = request.getHeaderNames(); while (reqHeaderEnum.hasMoreElements()) { String headerName = (String) reqHeaderEnum.nextElement(); headers.put(headerName.toLowerCase(), request.getHeader(headerName)); } //调用链logSwatch Java110TraceFactory.createTrace(url, headers,getReqData(request)); return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.debug("完成拦截器Java110TraceHandlerInterceptor>>afterCompletion"); Java110TraceFactory.putAnnotations(TraceAnnotationsDto.VALUE_CLIENT_RECEIVE); //response.getOutputStream(); } public String getReqData(HttpServletRequest request) throws Exception{ String reqData = ""; if ("POST,PUT".contains(request.getMethod())) { InputStream in = request.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); //reader. StringBuffer sb = new StringBuffer(); String str = ""; while ((str = reader.readLine()) != null) { sb.append(str); } reqData = sb.toString(); } else { Map params = request.getParameterMap(); if (params != null && !params.isEmpty()) { JSONObject paramObj = new JSONObject(); for (String key : params.keySet()) { if (params.get(key).length > 0) { String value = ""; for (int paramIndex = 0; paramIndex < params.get(key).length; paramIndex++) { value += (params.get(key)[paramIndex] + ","); } value = value.endsWith(",") ? value.substring(0, value.length() - 1) : value; paramObj.put(key, value); } continue; } reqData = paramObj.toJSONString(); } } return reqData; } }