SpringCloudGateway源码解析:RemoveCachedBodyFilter

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;
	}

}

猜你喜欢

转载自blog.csdn.net/lizz861109/article/details/109747500