package com.zhongan.business.interceptor;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import com.zhongan.business.constant.Constant;
import com.zhongan.business.enums.HeaderEnum;
import com.zhongan.business.util.HMACSHA1Util;
public class UserContextInterceptor implements ClientHttpRequestInterceptor{
private static final Logger logger=LoggerFactory.getLogger(UserContextInterceptor.class);
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
HttpHeaders headers=request.getHeaders();
// HTTP请求header中设置 透传日志序列号
String logSerialNumber = MDC.get(“logSerialNumber ”);
//给HTTP请求头部加上日志跟踪信息
if (StringUtils.isNotBlank(logSerialNumber)) {
headers.add(HeaderEnum.LOG_SERIAL_NUMBER.getValue(), logSerialNumber);
}else{
headers.add(HeaderEnum.LOG_SERIAL_NUMBER.getValue(), "un_" + System.currentTimeMillis());
}
HeaderEnum.getValueMap().forEach((key,value)->headers.add(key, value));
headers.add(HeaderEnum.TIME_SPAN.getValue(),System.currentTimeMillis()+"");//时间戳
logRequest(request, body);
ClientHttpResponse response= execution.execute(request, body);
logResponse(response);
return response;
}
private String generateSign(HttpHeaders headers,String key){
if(headers==null){
return “”;
}
return HMACSHA1Util.generateHMAC(HMACSHA1Util.getSignData((headerKey)->headers.getFirst(headerKey)), key);
}
private void logRequest(HttpRequest request,byte[] body) throws IOException{
logger.info("请求uri:{},method:{},headers:{},body:{}",request.getURI(),request.getMethodValue(),request.getHeaders(),new String(body,"UTF-8"));
}
private void logResponse(ClientHttpResponse response) throws IOException{
BufferedReader reader=new BufferedReader(new InputStreamReader(response.getBody(),"UTF-8"));
StringBuilder sb=new StringBuilder();
String line=reader.readLine();
while(line!=null){
sb.append(line).append(";");
line=reader.readLine();
}
logger.info("返回statusCode:{},statusTest:{},headers:{},body:{}",response.getStatusCode(),response.getStatusText(),response.getHeaders(),sb.toString());
}
}