使用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;
}
@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”);
配置生效
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());
}
}