|
@ -7,20 +7,33 @@ import com.yihu.admin.client.util.NetworkUtil;
|
|
|
import com.yihu.admin.client.websocket.event.HttpEvent;
|
|
|
import com.yihu.admin.client.websocket.sender.SimpleEventSender;
|
|
|
import net.sf.json.JSONObject;
|
|
|
import okhttp3.*;
|
|
|
import okhttp3.internal.http.HttpMethod;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
|
import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper;
|
|
|
import org.springframework.cloud.sleuth.Tracer;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
import org.springframework.util.LinkedMultiValueMap;
|
|
|
import org.springframework.util.StreamUtils;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
import java.io.InputStream;
|
|
|
import java.util.Enumeration;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
* Created by chenweida on 2018/5/31 0031.
|
|
|
*/
|
|
|
@Component
|
|
|
@ConditionalOnProperty(name = "yihu.admin.client.advice.zuul.pre", havingValue = "true")
|
|
|
public class ZuulPreFilter extends ZuulFilter {
|
|
|
private Logger logger= LoggerFactory.getLogger(ZuulPreFilter.class);
|
|
|
@Autowired
|
|
|
private Tracer tracer;
|
|
|
@Autowired
|
|
@ -29,12 +42,13 @@ public class ZuulPreFilter extends ZuulFilter {
|
|
|
private AdminClientProperties adminClientProperties;
|
|
|
@Value("${spring.application.name}")
|
|
|
private String spanrName;
|
|
|
|
|
|
@Autowired
|
|
|
private ProxyRequestHelper helper;
|
|
|
@Override
|
|
|
public String filterType() {
|
|
|
//filterType:返回过滤器的类型。有pre、route、post、error等几种取值
|
|
|
|
|
|
return "pre";
|
|
|
return "route";
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@ -51,43 +65,96 @@ public class ZuulPreFilter extends ZuulFilter {
|
|
|
|
|
|
@Override
|
|
|
public Object run() {
|
|
|
RequestContext ctx = RequestContext.getCurrentContext();
|
|
|
HttpServletRequest request = ctx.getRequest();
|
|
|
try {
|
|
|
RequestContext ctx = RequestContext.getCurrentContext();
|
|
|
HttpServletRequest request = ctx.getRequest();
|
|
|
OkHttpClient httpClient = new OkHttpClient.Builder()
|
|
|
// customize
|
|
|
.build();
|
|
|
|
|
|
|
|
|
try {
|
|
|
String method = request.getMethod();
|
|
|
|
|
|
String uri = this.helper.buildZuulRequestURI(request);
|
|
|
|
|
|
Headers.Builder headers = new Headers.Builder();
|
|
|
Enumeration<String> headerNames = request.getHeaderNames();
|
|
|
while (headerNames.hasMoreElements()) {
|
|
|
String name = headerNames.nextElement();
|
|
|
Enumeration<String> values = request.getHeaders(name);
|
|
|
|
|
|
while (values.hasMoreElements()) {
|
|
|
String value = values.nextElement();
|
|
|
headers.add(name, value);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
InputStream inputStream = request.getInputStream();
|
|
|
|
|
|
RequestBody requestBody = null;
|
|
|
if (inputStream != null && HttpMethod.permitsRequestBody(method)) {
|
|
|
MediaType mediaType = null;
|
|
|
if (headers.get("Content-Type") != null) {
|
|
|
mediaType = MediaType.parse(headers.get("Content-Type"));
|
|
|
}
|
|
|
requestBody = RequestBody.create(mediaType, StreamUtils.copyToByteArray(inputStream));
|
|
|
}
|
|
|
|
|
|
Request.Builder builder = new Request.Builder()
|
|
|
.headers(headers.build())
|
|
|
.url(uri)
|
|
|
.method(method, requestBody);
|
|
|
//日志
|
|
|
HttpEvent event = new HttpEvent();
|
|
|
Long startTime = System.currentTimeMillis();
|
|
|
String ip = NetworkUtil.getIpAddress(request);
|
|
|
JSONObject headerObj = new JSONObject();
|
|
|
Enumeration<String> headers = request.getHeaderNames();
|
|
|
while (headers.hasMoreElements()) {
|
|
|
String value = headers.nextElement();
|
|
|
Enumeration<String> headersed = request.getHeaderNames();
|
|
|
while (headersed.hasMoreElements()) {
|
|
|
String value = headersed.nextElement();
|
|
|
headerObj.put(value, request.getHeader(value));
|
|
|
}
|
|
|
|
|
|
event.setHeader(headerObj.toString());
|
|
|
event.setEventStartTime(startTime);
|
|
|
event.setEventEndTime(startTime);
|
|
|
event.setExcuteTime(0L);
|
|
|
event.setHeader(headerObj.toString());
|
|
|
event.setEventName("system_zuul_tracer");
|
|
|
event.setSpanName(spanrName);
|
|
|
event.setSpanId(tracer.getCurrentSpan().getSpanId() + "");
|
|
|
event.setTraceId(tracer.getCurrentSpan().traceIdString());
|
|
|
event.setRequestParams(JSONObject.fromObject(request.getParameterMap()).toString());
|
|
|
event.setSuccess(1);
|
|
|
event.setUri(HttpAdvice.matchURI(request));
|
|
|
event.setIp(ip);
|
|
|
event.setMethod(request.getMethod());
|
|
|
simpleEventSender.send(event);
|
|
|
Response response = httpClient.newCall(builder.build()).execute();
|
|
|
try{
|
|
|
Long endTime = System.currentTimeMillis();
|
|
|
event.setHeader(headerObj.toString());
|
|
|
event.setEventStartTime(startTime);
|
|
|
event.setEventEndTime(endTime);
|
|
|
event.setExcuteTime(endTime-startTime);
|
|
|
event.setHeader(headerObj.toString());
|
|
|
event.setEventName("system_zuul_tracer");
|
|
|
event.setResponseParams( response.body().string());
|
|
|
event.setSpanName(spanrName);
|
|
|
event.setSpanId(tracer.getCurrentSpan().getSpanId() + "");
|
|
|
event.setTraceId(tracer.getCurrentSpan().traceIdString());
|
|
|
event.setRequestParams(JSONObject.fromObject(request.getParameterMap()).toString());
|
|
|
event.setSuccess(1);
|
|
|
event.setUri(HttpAdvice.matchURI(request));
|
|
|
event.setIp(ip);
|
|
|
event.setMethod(request.getMethod());
|
|
|
simpleEventSender.send(event);
|
|
|
}catch (Exception e){
|
|
|
|
|
|
}
|
|
|
|
|
|
LinkedMultiValueMap<String, String> responseHeaders = new LinkedMultiValueMap<>();
|
|
|
|
|
|
for (Map.Entry<String, List<String>> entry : response.headers().toMultimap().entrySet()) {
|
|
|
responseHeaders.put(entry.getKey(), entry.getValue());
|
|
|
}
|
|
|
|
|
|
this.helper.setResponse(response.code(), response.body().byteStream(),responseHeaders);
|
|
|
ctx.setRouteHost(null); // prevent SimpleHostRoutingFilter from running
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
}
|
|
|
|
|
|
HttpServletResponse response = ctx.getResponse();
|
|
|
|
|
|
|
|
|
return response;
|
|
|
return null;
|
|
|
}
|
|
|
}
|