`

SpringCloud Gateway拦截器遇到的小坑汇总

阅读更多

很多朋友在使用SpringCloudGateway的时候可能都碰到过以下几个问题

SpringCloudGateway中如何读取Post请求体
    private BodyInserter getBodyInserter(ServerWebExchange exchange) {        ServerRequest serverRequest = new DefaultServerRequest(exchange);        Mono<String> modifiedBody = serverRequest.bodyToMono(String.class)                .flatMap(body -> {                   //这里的body就是Post的请求体                });        BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, String.class);        return bodyInserter;    }
SpringCloudGateway中Post请求参数只能读取一次

这是因为Gateway默认使用的是SpringWebflux,解决这个问题需要容重新构造一个request来替换原先的request

HttpHeaders headers=new HttpHeaders();        CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers);        ServerHttpRequestDecorator decorator = this.getServerHttpRequestDecorator(exchange,outputMessage);       ServerHttpRequestDecorator decorator = new ServerHttpRequestDecorator(                exchange.getRequest()) {            @Override            public Flux<DataBuffer> getBody() {                return outputMessage.getBody();            }        };

当ServerHttpRequestDecorator构建完成之后需要在拦截器中使用如下方法替换原先的request

chain.filter(exchange.mutate().request(decorator).build());
SpringCloudGateway中如何读取后段服务的返回数据

与上方替换request的思路一致,替换response即可

private ServerHttpResponse getServerHttpResponse(ServerWebExchange exchange) {        ServerHttpResponse originalResponse = exchange.getResponse();        DataBufferFactory bufferFactory = originalResponse.bufferFactory();        ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {

@Override public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
Flux<DataBuffer> flux = null; if (body instanceof Mono) { Mono<? extends DataBuffer> mono = (Mono<? extends DataBuffer>) body; body = mono.flux();
} if (body instanceof Flux) { flux = (Flux<DataBuffer>) body; return super.writeWith(flux.buffer().map(dataBuffers -> { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); dataBuffers.forEach(i -> { byte[] array = new byte[i.readableByteCount()]; i.read(array); DataBufferUtils.release(i); outputStream.write(array, 0, array.length); }); String result = outputStream.toString(); try { if (outputStream != null) { outputStream.close(); } } catch (IOException e) { e.printStackTrace(); } log.info("后端返回数据:{}", result); return bufferFactory.wrap(result.getBytes()); })); }
log.info("降级处理返回数据:{}" + body); return super.writeWith(body); }
}; return decoratedResponse; }

上方是获取新的response,获取到新的之后和之前的套路一样,这样操作:

return chain.filter(exchange.mutate().request(decorator).response(decoratedResponse).build());

可能有的同学会碰到即使按照我上述的方法重写了response但是也无法读取到返回数据,这个原因可能是因为拦截器的优先级配置有问题,只需要实现Ordered接口并且重写getOrder方法,然后设置优先级小于-1即可

   @Override    public int getOrder() {        return -2;    }

 

 

本文完整源码地址点击阅读原文地址获取

往期好文

阅读源码的小技巧 

SpringBoot源码解析系列汇总

Spring源码解析系列汇总

Eureka源码解析系列汇总

SpringCloud服务调用源码解析汇总

RabbitMQ系列汇总

SpringCloud基础系列汇总

Redis系列汇总

MySQL系列汇总

1

0
1
分享到:
评论

相关推荐

    springcloud Gateway网关-压测用.zip

    而"简单路由及默认过滤器"则意味着Gateway已经配置了一些基础的路由规则,将请求导向不同的微服务,同时使用了SpringCloud Gateway提供的默认过滤器链,这些过滤器可能包括请求限流、身份验证等。 接下来,我们看到...

    最新Spring Cloud Gateway 官方参考指南-中文版-3.x

    Spring Cloud Gateway 是一款基于Spring生态系统构建的API网关,它主要设计用于提供一种简单而有效的方式来路由API,并为API提供核心关注点,如安全性、监控/度量和弹性。在3.1.3版本中,它利用了Spring Boot 2.x、...

    Spring Cloud Gateway 整合 Spring Security 统一登录认证鉴权

    在构建分布式系统时,Spring Cloud Gateway 作为微服务架构中的边缘服务或 API 网关,扮演着至关重要的角色。它负责路由请求到相应的微服务,并可以提供过滤器功能,如限流、熔断等。而Spring Security 则是 Java ...

    Spring Cloud Gateway的全局异常处理

    Spring Cloud Gateway作为一款基于Spring Framework 5、Project Reactor和Spring Boot 2.0构建的云原生网关框架,它提供了强大的路由转发能力和灵活的过滤器模型,能够很好地满足微服务网关的各种需求。然而,在实际...

    springcloud gateway 全局过滤器统一签名判定.doc

    在Spring Cloud Gateway中,全局过滤器(Global Filter)是一种强大的机制,用于在请求路由到具体的服务之前或之后执行通用的处理逻辑。在这个场景中,我们关注的是如何利用全局过滤器来实现统一的签名验证,这在...

    springcloud下通过gateway转发websocket

    5. 配合过滤器实现额外功能:Spring Cloud Gateway还提供了过滤器机制,可以根据需求自定义过滤器,例如添加认证、日志记录等功能。通过实现`GlobalFilter`接口并注册到Spring容器中,可以在WebSocket请求生命周期的...

    spring cloud gateway配置Hystrix 熔断、限流、后台调用注意点.pdf

    Spring Cloud Gateway 提供了多种限流策略,包括基于 Redis 的限流器。我们可以使用 `@Bean` 注解来配置限流器,例如: ```java @Bean public RedisRateLimiter redisRateLimiter() { // yaml 配置文件已经有了,...

    spring cloud gateway 例子

    Spring Cloud Gateway 是一款基于 Spring Framework 5 和 Spring Boot 2 设计的云原生微服务网关,它旨在提供一种简单而有效的方式来对 API 进行路由,同时提供了过滤器功能,可以进行权限验证、限流、日志记录等...

    Spring Cloud Gateway 2.1 使用手册中文版.pdf

    这个项目提供了一个构建在 Spring 生态系统之上的 API 网关,包括:Spring 5,Spring ... Spring Cloud Gateway 旨在提供一种简单而有效的 API 路 由方式,并为其提供横切关注点,例如:安全,监控/指标和弹性。

    Spring Cloud Eureka + Spring Cloud Gateway + Spring Cloud Zipkin

    Spring Cloud Eureka、Spring Cloud Gateway和Spring Cloud Zipkin是微服务架构中常用的一组组件,它们各自在分布式系统中承担着不同的角色。本项目通过Maven进行构建,旨在实现一个完整的微服务治理和监控解决方案...

    SpringCloudGateway2.1使用手册中文版.rar

    SpringCloud Gateway 是一款基于 Spring Framework 5 和 Spring Boot 2 构建的微服务网关,它是 Spring Cloud 生态系统中的重要组件,主要用于处理服务之间的路由、过滤和安全控制等。在 Spring Cloud Gateway 2.1 ...

    spring cloud zookeeper gateway

    Spring Cloud Zookeeper Gateway 是一个基于Spring Cloud生态系统的项目,它结合了Zookeeper作为微服务注册中心和Spring Cloud Gateway作为服务网关的解决方案。这个项目旨在为开发者提供一个快速搭建微服务架构的...

    详解SpringCloud Finchley Gateway 统一异常处理

    详解 SpringCloud Finchley Gateway 统一异常处理 SpringCloud Finchley Gateway 统一异常处理是指在使用 SpringCloud Finchley 版本的 Gateway 时,如何统一处理系统级异常的方法。默认情况下,SpringCloud ...

    基于Nacos实现Spring Cloud Gateway实现动态路由的方法示例

    在现代微服务架构中,Spring Cloud Gateway作为一款强大的API网关,被广泛应用于服务路由、熔断、限流等场景。而Nacos作为阿里巴巴提供的一个分布式服务治理平台,提供了服务注册与发现、配置管理等功能。将Nacos与...

    spring cloud gateway跨域实现

    Spring Cloud Gateway 是Spring官方推出的一款现代化的网关服务,它构建于Spring Framework 5、Project Reactor 和 Spring Boot 2之上,提供了高性能、易用的API路由管理、过滤器等功能,是Spring Cloud生态中的重要...

    SpringCloud Finchley Gateway 缓存请求Body和Form表单的实现

    在构建微服务架构时,Spring Cloud Gateway作为API网关,起着至关重要的作用。它提供了路由、过滤器等功能,能够方便地对上游请求进行处理和转发。然而,有些场景下,我们可能需要缓存请求的Body(如JSON数据)或...

    spring-cloud-gateway-demo.zip

    Spring Cloud Gateway 是一款基于 Spring Framework 5 和 Spring Boot 2 设计的现代化微服务路由网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。在本示例 "spring-cloud-gateway-demo.zip" 中...

    Spring Cloud Gateway模块

    Spring Cloud Gateway模块

    springcloud gateway

    Spring Cloud Gateway 是一个基于 Spring Framework 5 和 Spring Boot 2 构建的微服务网关,它是 Spring Cloud 生态系统中的重要组件,旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。它作为一个高可...

    SpringCloud.03.网关Gateway 配置文件

    在Spring Cloud生态体系中,Spring Cloud Gateway作为新一代的API网关,被广泛应用于微服务架构中,用于统一处理请求路由、过滤器链、限流、熔断等核心功能。本篇将详细介绍Spring Cloud Gateway的配置文件相关知识...

Global site tag (gtag.js) - Google Analytics