实现GlobalFilter则所有该自定义Filter会对所有的路由生效。
编写全局日志拦截器代码
public class GlobalLogFilter implements GlobalFilter, Ordered {
private static final Logger logger = LoggerFactory.getLogger(GlobalLogFilter.class);
private int order;
private static final String REQUEST_PREFIX = "\n--------------------------------- Request Info -----------------------------";
private static final String REQUEST_TAIL = "\n-----------------------------------------------------------------------------";
private static final String RESPONSE_PREFIX = "\n--------------------------------- Response Info -----------------------------";
private static final String RESPONSE_TAIL = "\n-------------------------------------------------------------------------->>>";
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
long start = DateUtil.getCurrentTime();
StringBuilder reqMsg = new StringBuilder();
StringBuilder resMsg = new StringBuilder();
ServerHttpRequest request = exchange.getRequest();
InetSocketAddress address = request.getRemoteAddress();
String method = request.getMethodValue();
URI uri = request.getURI();
HttpHeaders headers = request.getHeaders();
Object cachedRequestBodyObject = exchange.getAttributeOrDefault(ConstantFilter.CACHED_REQUEST_BODY_OBJECT_KEY, null);
byte[] body = (byte[]) cachedRequestBodyObject;
String params = new String(body);
Map queryMap = request.getQueryParams();
String query = JSON.toJSONString(queryMap);
reqMsg.append(REQUEST_PREFIX);
reqMsg.append("\n header=").append(headers);
reqMsg.append("\n query=").append(query);
reqMsg.append("\n params=").append(params);
reqMsg.append("\n address=").append(address.getHostName()).append(address.getPort());
reqMsg.append("\n method=").append(method);
reqMsg.append("\n url=").append(uri.getPath());
reqMsg.append(REQUEST_TAIL);
logger.info(reqMsg.toString());
ServerHttpResponse response = exchange.getResponse();
DataBufferFactory bufferFactory = response.bufferFactory();
resMsg.append(RESPONSE_PREFIX);
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(response) {
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
if (body instanceof Flux) {
Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body;
return super.writeWith(fluxBody.map(dataBuffer -> {
byte[] content = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(content);
String responseResult = new String(content, Charset.forName("UTF-8"));
resMsg.append("\n status=").append(this.getStatusCode());
resMsg.append("\n header=").append(this.getHeaders());
resMsg.append("\n responseResult=").append(responseResult);
resMsg.append(RESPONSE_TAIL);
long end = DateUtil.getCurrentTime();
long time = end - start;
resMsg.append("耗时ms:").append(time);
logger.info(resMsg.toString());
return bufferFactory.wrap(content);
}));
}
return super.writeWith(body);
}
};
return chain.filter(exchange.mutate().response(decoratedResponse).build());
}
@Override
public int getOrder() {
return this.order;
}
public GlobalLogFilter(int order){
this.order = order;
}
}
在代码中配置全局拦截器
@Configuration
public class GatewayConfig {
@Bean
public GlobalLogFilter globalLogFilter(){
return new GlobalLogFilter(-20);
}
}
转载请注明原文地址:https://blackberry.8miu.com/read-2137.html