//@Slf4j
//@Component
public class AccessLogGlobalFilter implements GlobalFilter {
private final ObjectMapper mapper = new ObjectMapper();
private final DataBufferFactory dataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String path = request.getPath().pathWithinApplication().value();
HttpMethod method = request.getMethod();
StringBuilder builder = new StringBuilder();
URI targetUri = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR);
if (HttpMethod.GET.equals(method)) {
MultiValueMap<String, String> queryParams = request.getQueryParams();
try {
builder.append(mapper.writeValueAsString(queryParams));
} catch (JsonProcessingException e) {
System.out.println(e.getMessage());
}
} else if (HttpMethod.POST.equals(method)) {
Flux<DataBuffer> body = request.getBody();
ServerHttpRequest serverHttpRequest = request.mutate().uri(request.getURI()).build();
body.subscribe(dataBuffer -> {
InputStream inputStream = dataBuffer.asInputStream();
try {
builder.append(StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8));
} catch (IOException e) {
System.out.println(e.getMessage());
}
});
request = new ServerHttpRequestDecorator(serverHttpRequest) {
@Override
public Flux<DataBuffer> getBody() {
return Flux.just(dataBufferFactory.wrap(builder.toString().getBytes(StandardCharsets.UTF_8)));
}
};
}
InetSocketAddress remoteAddress = request.getRemoteAddress();
return chain.filter(exchange.mutate().request(request).build()).then(Mono.fromRunnable(() -> {
ServerHttpResponse response = exchange.getResponse();
HttpStatus statusCode = response.getStatusCode();
System.out.println("请求路径:{"+path+"},远程IP地址:{"+ remoteAddress+"},请求方法:{"+method+"},请求参数:{"+builder.toString()+"},目标URI:{"+targetUri+"},响应码:{"+statusCode+"}"
);
}));
}
}