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());
                    }));
    }
  • 相关阅读:
    IDEA激活及使用丶
    内网渗透-windows认证
    应急响应必备技能
    云计算期末考试---
    常见GetShell
    SQL Sever提权
    Socks协议以及代理转发工具分析
    最近两场HVV总结
    ATK&CK红队评估实战靶场 (一)的搭建和模拟攻击过程全过程
    应急响应之勒索病毒
  • 原文地址:https://www.cnblogs.com/zzq-include/p/12944680.html
Copyright © 2011-2022 走看看