@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);
HttpHeaders headers = request.getHeaders();
log.info("请求headers:{}", headers);
HttpStatus httpStatus = response.getStatusCode();
Integer resultStatus = 1;
if (httpStatus.equals(HttpStatus.OK)) {
resultStatus = 0;
}
MediaType contentType = request.getHeaders().getContentType();
log.info("contentType:{}", contentType);
try{
**//获取请求body
StringBuffer body = new StringBuffer();
ExecutorService executorService = Executors.newSingleThreadExecutor();
if (Objects.nonNull(contentType) && contentType.toString().contains(MediaType.APPLICATION_JSON_VALUE)) {
Flux<DataBuffer> bodyBuffer = request.getBody();
String content = bodyBuffer.collectList().map(dataBuffers -> {
byte[] bytes = new byte[dataBuffers.stream().mapToInt(DataBuffer::readableByteCount).sum()];
int offset = 0;
for (DataBuffer dataBuffer : dataBuffers) {
int length = dataBuffer.readableByteCount();
dataBuffer.read(bytes, offset, length);
offset += length;
DataBufferUtils.release(dataBuffer);
}
try {
return new String(bytes, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return "";
}
}).block();
body.append(content);
log.info("req.getBody():{}", content);**
log.info("req.getBody().length:{}", content.length());
// 复制请求体并缓存
Mono<String> cachedRequestBody = Mono.just(body.toString());
// 创建包装器对象并将其传递给下一个链条
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);
}else if (request.getMethod().name().toUpperCase().equals("GET")){
// 业务代码
}
}catch (Exception e){
log.error("WebLogFilter filter error: {}", e.getMessage());
}
// 处理其他请求方式和参数类型
return chain.filter(exchange);
}
在WebFilter中实现filter方法,并获取请求body的实现
最新推荐文章于 2024-07-14 22:18:32 发布