全局过滤器修改请求体
ModifyRequestBodyGlobalFilter是参考官方的ModifyRequestBodyGatewayFilterFactory,可以直接复制,只需在modifyBody方法中实现自定义逻辑。在ModifyRequestBodyGatewayFilterFactory是使用CachedBodyOutputMessage,但CachedBodyOutputMessage的isCache方法是default权限,我们自定义的类无法访问,故给isCache加上public权限就有了MyCachedBodyOutputMessage。
/**
* 参考 {@link org.springframework.cloud.gateway.filter.factory.rewrite.ModifyRequestBodyGatewayFilterFactory}
* @author mask
* @since 2022/7/14 17:02
*/
@Component
@Slf4j
public class ModifyRequestBodyGlobalFilter implements GlobalFilter, Ordered {
@Override
public int getOrder() {
return -2;
}
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerRequest serverRequest = ServerRequest.create(exchange, HandlerStrategies.withDefaults().messageReaders());
Mono<String> modifiedBody = serverRequest.bodyToMono(String.class).flatMap(originalBody -> modifyBody()
.apply(exchange,originalBody));
BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, String.class);
HttpHeaders headers = new HttpHeaders();
headers.putAll(exchange.getRequest().getHeaders());
headers.remove("Content-Length");
MyCachedBodyOutputMessage outputMessage = new MyCachedBodyOutputMessage(exchange, headers);
return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() -> {
ServerHttpRequest decorator = decorate(exchange, headers, outputMessage);
return chain.filter(exchange.mutate().request(decorator).build());
})).onErrorResume((throwable) -> {
return release(exchange, outputMessage,(Throwable) throwable);
});
}
private BiFunction<ServerWebExchange, String, Mono<String>> modifyBody() {
return new BiFunction<ServerWebExchange, String, Mono<String>>() {
@Override
public Mono<String> apply(ServerWebExchange serverWebExchange, String raw) {
try {