使用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>
定义全局过滤器
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;}@Overridepublic 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() {@Overridepublic 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);}@Overridepublic int getOrder() {return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER - 1;}
}
注意以下这行内容为新增的内容
map.put(“version”, “1.0.22”);
配置生效
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;@Beanpublic 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);}@Beanpublic ModifyResponseBodyFilter modifyResponseBodyFilter(ServerCodecConfigurer codecConfigurer, Set<MessageBodyDecoder> bodyDecoders,Set<MessageBodyEncoder> bodyEncoders) {return new ModifyResponseBodyFilter(bodyDecoders, bodyEncoders, codecConfigurer.getReaders());}
}