Gateway统一修改响应内容

使用Gateway的时候,如何统一修改相应内容

版本信息

复制代码
<spring-cloud-alibaba.version>2021.0.6.0</spring-cloud-alibaba.version>
<spring-boot.version>2.6.13</spring-boot.version>
<spring-cloud.version>2021.0.5</spring-cloud.version>

定义全局过滤器

java 复制代码
import lombok.extern.slf4j.Slf4j;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.shaded.com.google.gson.Gson;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter;
import org.springframework.cloud.gateway.filter.factory.rewrite.MessageBodyDecoder;
import org.springframework.cloud.gateway.filter.factory.rewrite.MessageBodyEncoder;
import org.springframework.cloud.gateway.filter.factory.rewrite.ModifyResponseBodyGatewayFilterFactory;
import org.springframework.cloud.gateway.filter.factory.rewrite.RewriteFunction;
import org.springframework.core.Ordered;
import org.springframework.http.codec.HttpMessageReader;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.List;
import java.util.Map;
import java.util.Set;

@Slf4j
public class ModifyResponseBodyFilter implements GlobalFilter, Ordered {

    private final Gson gson = new Gson();
    private final Set<MessageBodyDecoder> messageBodyDecoders;
    private final Set<MessageBodyEncoder> messageBodyEncoders;
    private final List<HttpMessageReader<?>> messageReaders;

    public ModifyResponseBodyFilter(Set<MessageBodyDecoder> messageBodyDecoders, Set<MessageBodyEncoder> messageBodyEncoders, List<HttpMessageReader<?>> messageReaders) {
        this.messageBodyDecoders = messageBodyDecoders;
        this.messageBodyEncoders = messageBodyEncoders;
        this.messageReaders = messageReaders;
    }


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ModifyResponseBodyGatewayFilterFactory.Config config = new ModifyResponseBodyGatewayFilterFactory.Config();
        config.setInClass(String.class);
        config.setOutClass(String.class);
        config.setRewriteFunction(new RewriteFunction() {
            @Override
            public Object apply(Object o, Object o2) {
                ServerWebExchange serverWebExchange = (ServerWebExchange) o;
                log.debug(JSONObject.toJSONString(o2));
                log.debug(o2.getClass().toString());
                String oldBody = (String) o2;
                Map map = gson.fromJson(oldBody, Map.class);
                map.put("version", "1.0.22");
                return Mono.just(gson.toJson(map));
            }
        });
        return new ModifyResponseBodyGatewayFilterFactory(messageReaders, messageBodyDecoders, messageBodyEncoders)
                .apply(config).filter(exchange, chain);
    }

    @Override
    public int getOrder() {
        return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER - 1;
    }
}

注意以下这行内容为新增的内容

map.put("version", "1.0.22");

配置生效

java 复制代码
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.filter.factory.rewrite.MessageBodyDecoder;
import org.springframework.cloud.gateway.filter.factory.rewrite.MessageBodyEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.szsti.qyjg.gateway.filter.ModifyResponseBodyFilter;

import java.util.Arrays;
import java.util.Set;

@Configuration
public class GatewayConfiguration {

    @Value("${spring.cross.allowedOrigin:}")
    private String allowedOriginUrl;

    @Bean
    public CorsWebFilter corsWebFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        // 跨域名单从配置文件中读取
        // 临时处理方案,这里采用的
        if (StringUtils.isNotEmpty(allowedOriginUrl)) {
            Arrays.stream(allowedOriginUrl.split(",")).forEach(it -> corsConfiguration.addAllowedOrigin(it));
        } else {
            corsConfiguration.addAllowedOrigin("*");
        }
        corsConfiguration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsWebFilter(source);
    }

    @Bean
    public ModifyResponseBodyFilter modifyResponseBodyFilter(
            ServerCodecConfigurer codecConfigurer, Set<MessageBodyDecoder> bodyDecoders,
            Set<MessageBodyEncoder> bodyEncoders) {
        return new ModifyResponseBodyFilter(bodyDecoders, bodyEncoders, codecConfigurer.getReaders());
    }
}

测试

相关推荐
Rysxt_2 天前
Spring Boot Gateway 教程:从入门到精通
spring boot·网关·gateway
月夕·花晨2 天前
Gateway -网关
java·服务器·分布式·后端·spring cloud·微服务·gateway
sanggou2 天前
License 集成 Spring Gateway:解决 WebFlux 非阻塞与 Spring MVC Servlet 阻塞兼容问题
spring·gateway·mvc
摘星编程8 天前
Nginx 502 Bad Gateway:从 upstream 日志到 FastCGI 超时复盘
网络·nginx·gateway·php-fpm·fastcgi
网硕互联的小客服8 天前
504 Gateway Timeout:服务器作为网关或代理时未能及时获得响应如何处理?
运维·服务器·gateway
Pierre_9 天前
通过SpringCloud Gateway实现API接口镜像请求(陪跑)网关功能
spring·spring cloud·gateway
kk在加油10 天前
智能门卫:Gateway
gateway
小安同学iter10 天前
Spring Cloud Gateway 网关(五)
java·开发语言·spring cloud·微服务·gateway
JAVA学习通10 天前
Spring Cloud ------ Gateway
java·spring cloud·gateway
weixin_4495687013 天前
访问Nginx 前端页面,接口报502 Bad Gateway
前端·nginx·gateway