package org.springframework.cloud.gateway.filter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import reactor.core.publisher.Mono;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.PooledDataBuffer;
import org.springframework.web.server.ServerWebExchange;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR;
/**
* 移除请求上下文中的body缓存信息
* 只有在使用了ReadBodyPredicateFactory相关处理是会有body缓存
* @version 2.2.5
*/
public class RemoveCachedBodyFilter implements GlobalFilter, Ordered {
private static final Log log = LogFactory.getLog(RemoveCachedBodyFilter.class);
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//mono处理完成后执行方法
return chain.filter(exchange).doFinally(s -> {
//移除上下文中的的cachedRequestBody信息
Object attribute = exchange.getAttributes().remove(CACHED_REQUEST_BODY_ATTR);
//如果body信息不空,则释放数据缓存
if (attribute != null && attribute instanceof PooledDataBuffer) {
PooledDataBuffer dataBuffer = (PooledDataBuffer) attribute;
if (dataBuffer.isAllocated()) {
if (log.isTraceEnabled()) {
log.trace("releasing cached body in exchange attribute");
}
dataBuffer.release();
}
}
});
}
/**
* 将该过滤器设置为最高优先级,优先加载
* @return
*/
@Override
public int getOrder() {
return HIGHEST_PRECEDENCE;
}
}