过滤器WebFilter的使用
@Slf4j
@Component
public class WebLogFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
String uri = request.getURI().getPath();
log.info("进入到过滤器中:doFilter() 方法");
// 获取uri
log.info("请求uri:{}", uri);
MediaType contentType = request.getHeaders().getContentType();
log.info("contentType:{}", contentType);
Flux<DataBuffer> bodyBuffer = request.getBody();
//获取请求body
final String[] body = {""};
bodyBuffer.subscribe(buffer -> {
byte[] bytes = new byte[buffer.readableByteCount()];
buffer.read(bytes);
DataBufferUtils.release(buffer);
try {
body[0] = new String(bytes, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
log.info("req.getBody():{}", body[0]);
});
// 复制请求体并缓存
Mono<String> cachedRequestBody = Mono.just(body[0]);
log.info("请求体:{}", body[0]);
// 创建包装器对象并将其传递给下一个链条
ServerHttpRequest wrappedRequest = new ServerHttpRequestDecorator(request) {
@Override
public Flux<DataBuffer> getBody() {
return cachedRequestBody.flatMapMany(body -> {
byte[] bytes = body.getBytes(StandardCharsets.UTF_8);
DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes);
return Flux.just(buffer);
});
}
};
ServerWebExchange wrappedExchange = exchange.mutate()
.request(wrappedRequest)
.build();
return chain.filter(wrappedExchange);
}
}