介绍
本人最近将网关zuul升级到gateway,gateway特点这里不多说了,gateway和zuul的区别很大,其底层使用了netty和响应式编程,而不是zuul常规的servlet方式。
原先的zuul网关里有对请求体验证签名和加密的逻辑,要把这些逻辑迁移到gateway中,这个过程中遇到的问题太多,例如 处理中异常如何处理、请求体或响应体过长会被拦截等等。这里把gateway通过的逻辑进行改造后直接贴出来,需要自己处理的逻辑可以直接添加进去。
处理请求体内容
RequestValidationFilter
@Component
@Slf4j
public class RequestValidationFilter implements GlobalFilter, Ordered {
@Autowired
private ServerCodecConfigurer serverCodecConfigurer;
@Override
public Mono<Void> filter(final ServerWebExchange exchange, final GatewayFilterChain chain) {
return readBody(exchange,chain);
}
private Mono<Void> readBody(ServerWebExchange exchange, GatewayFilterChain chain){
log.info("current thread readBody : {}",Thread.currentThread().getName());
ServerRequest serverRequest = ServerRequest.create(exchange, serverCodecConfigurer.getReaders());
Map<String,String> headMap = new HashMap<>();
Mono<String> modifiedBody = serverRequest.bodyToMono(String.class).flatMap(originalBody -> {
//处理请求体和请求头逻辑的方法
String body = handle(originalBody, exchange, headMap);
return Mono.just(body);
});
BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, String.class);
HttpHeaders headers = new HttpHeaders();
headers.putAll(exchange.getRequest().getHeaders());
headers.remove(