zoukankan      html  css  js  c++  java
  • spring cloud gateway 读取requestBody,使用全局过滤器的方式。不需要在特定的Route中加readBody缓存predicate

    @Component
    public class RequestBodyAddCacheGlobalFilter implements GlobalFilter, Ordered {
        @Autowired
        ApplicationEventPublisher applicationEventPublisher;
    
        @Autowired
        ApplicationContext applicationContext;
    
        private final List<HttpMessageReader<?>> messageReaders = HandlerStrategies.withDefaults().messageReaders();
    
        public static final String CACHE_REQUEST_BODY_OBJECT_KEY = "cachedRequestBodyObject";
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            Class inClass = String.class;
            Class outClass = String.class;
            ServerRequest serverRequest = ServerRequest.create(exchange, messageReaders);
            // TODO: flux or mono
            Mono<?> bodyMono = serverRequest
                    .bodyToMono(inClass)
                    .flatMap(body -> {
                        exchange.getAttributes().put(CACHE_REQUEST_BODY_OBJECT_KEY, body);
                        return Mono.just(body);
                    });
    
            BodyInserter bodyInserter = BodyInserters.fromPublisher(bodyMono, outClass);
            HttpHeaders headers = new HttpHeaders();
            headers.putAll(exchange.getRequest().getHeaders());
            CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers);
            return bodyInserter.insert(outputMessage, new BodyInserterContext())
                    .then(Mono.defer(() -> {
                        ServerHttpRequest decorator = new ServerHttpRequestDecorator(exchange.getRequest()) {
                            @Override
                            public Flux<DataBuffer> getBody() {
                                return outputMessage.getBody();
                            }
                        };
                        return chain.filter(exchange.mutate().request(decorator).build());
                    }));
    }
  • 相关阅读:
    python学习之字典合并
    python学习之列表、元组、集合、字典随笔
    图像检索中的概念
    卷积、反卷积、转置卷积资源
    计算机视觉顶级会议和期刊
    Week17
    Python协程资源
    深度图像资源
    Geo-localization论文阅读list2
    NetVLAD原理详解和推导
  • 原文地址:https://www.cnblogs.com/zzq-include/p/12944680.html
Copyright © 2011-2022 走看看