Created
November 27, 2018 06:27
-
-
Save Gsealy/a468da7d36a65de9f5b959f2b20f0bca to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import org.springframework.cloud.gateway.filter.GatewayFilterChain; | |
import org.springframework.cloud.gateway.filter.GlobalFilter; | |
import org.springframework.core.Ordered; | |
import org.springframework.core.io.buffer.DataBuffer; | |
import org.springframework.core.io.buffer.DataBufferUtils; | |
import org.springframework.http.server.reactive.ServerHttpRequest; | |
import org.springframework.http.server.reactive.ServerHttpRequestDecorator; | |
import org.springframework.stereotype.Component; | |
import org.springframework.web.server.ServerWebExchange; | |
import reactor.core.publisher.Flux; | |
import reactor.core.publisher.Mono; | |
/** | |
* 全局缓存body | |
* | |
* @author Gsealy | |
* @date 2018/11/22 13:42 | |
*/ | |
@Component | |
public class CacheBodyGatewayFilter implements Ordered, GlobalFilter { | |
private static final String CACHE_REQUEST_BODY_OBJECT_KEY = "cachedRequestBodyObject"; | |
@Override | |
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { | |
return DataBufferUtils.join(exchange.getRequest().getBody()) | |
.flatMap(dataBuffer -> { | |
DataBufferUtils.retain(dataBuffer); | |
Flux<DataBuffer> cachedFlux = Flux | |
.defer(() -> Flux.just(dataBuffer.slice(0, dataBuffer.readableByteCount()))); | |
ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) { | |
@Override | |
public Flux<DataBuffer> getBody() { | |
return cachedFlux; | |
} | |
}; | |
exchange.getAttributes().put(CACHE_REQUEST_BODY_OBJECT_KEY, cachedFlux); | |
return chain.filter(exchange.mutate().request(mutatedRequest).build()); | |
}); | |
} | |
/** | |
* 缓存为最高优先级 | |
* <p> | |
* 1 | |
* | |
* @return | |
*/ | |
@Override | |
public int getOrder() { | |
return Ordered.HIGHEST_PRECEDENCE; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment