diff --git a/ensign-gateway/pom.xml b/ensign-gateway/pom.xml
index b2a82ef..2178ad5 100644
--- a/ensign-gateway/pom.xml
+++ b/ensign-gateway/pom.xml
@@ -48,6 +48,11 @@
fastjson2
2.0.52
+
+
+ org.apache.commons
+ commons-lang3
+
@@ -59,6 +64,7 @@
import
+
diff --git a/ensign-gateway/src/main/java/com/ensign/ensigngateway/conf/CorsResponseHeaderFilter.java b/ensign-gateway/src/main/java/com/ensign/ensigngateway/conf/CorsResponseHeaderFilter.java
new file mode 100644
index 0000000..d8d16a1
--- /dev/null
+++ b/ensign-gateway/src/main/java/com/ensign/ensigngateway/conf/CorsResponseHeaderFilter.java
@@ -0,0 +1,65 @@
+package com.ensign.ensigngateway.conf;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter;
+import org.springframework.core.Ordered;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: TODO
+ * @Date: 2024/10/30 9:30
+ * @Created: by ZZSLL
+ */
+
+@Component
+public class CorsResponseHeaderFilter implements GlobalFilter, Ordered {
+
+ private static final Logger logger = LoggerFactory.getLogger(CorsResponseHeaderFilter.class);
+
+ private static final String ANY = "*";
+
+ @Override
+ public int getOrder() {
+ // 指定此过滤器位于NettyWriteResponseFilter之后
+ // 即待处理完响应体后接着处理响应头
+ return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1;
+ }
+
+ @Override
+ @SuppressWarnings("serial")
+ public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+ return chain.filter(exchange).then(Mono.fromRunnable(() -> {
+ exchange.getResponse().getHeaders().entrySet().stream()
+ .filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1))
+ .filter(kv -> (kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)
+ || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)
+ || kv.getKey().equals(HttpHeaders.VARY)))
+ .forEach(kv ->
+ {
+ // Vary只需要去重即可
+ if(kv.getKey().equals(HttpHeaders.VARY))
+ kv.setValue(kv.getValue().stream().distinct().collect(Collectors.toList()));
+ else{
+ List value = new ArrayList<>();
+ if(kv.getValue().contains(ANY)){ //如果包含*,则取*
+ value.add(ANY);
+ kv.setValue(value);
+ }else{
+ value.add(kv.getValue().get(0)); // 否则默认取第一个
+ kv.setValue(value);
+ }
+ }
+ });
+ }));
+ }
+}
diff --git a/ensign-gateway/src/main/java/com/ensign/ensigngateway/conf/GlobalCorsConfig.java b/ensign-gateway/src/main/java/com/ensign/ensigngateway/conf/GlobalCorsConfig.java
new file mode 100644
index 0000000..ce19e0e
--- /dev/null
+++ b/ensign-gateway/src/main/java/com/ensign/ensigngateway/conf/GlobalCorsConfig.java
@@ -0,0 +1,36 @@
+package com.ensign.ensigngateway.conf;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.reactive.CorsWebFilter;
+import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
+
+/**
+ * @Description: TODO
+ * @Date: 2024/10/30 9:21
+ * @Created: by ZZSLL
+ */
+
+
+@Configuration
+public class GlobalCorsConfig {
+ @Bean
+ public CorsWebFilter corsWebFilter() {
+ CorsConfiguration config = new CorsConfiguration();
+ // 这里仅为了说明问题,配置为放行所有域名,生产环境请对此进行修改
+ config.addAllowedOriginPattern("*");
+ // 放行的请求头
+ config.addAllowedHeader("*");
+ // 放行的请求方式,主要有:GET, POST, PUT, DELETE, OPTIONS
+ config.addAllowedMethod("*");
+ // 暴露头部信息
+ config.addExposedHeader("*");
+ // 是否发送cookie
+ config.setAllowCredentials(true);
+
+ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+ source.registerCorsConfiguration("/**", config);
+ return new CorsWebFilter(source);
+ }
+}
diff --git a/ensign-gateway/src/main/java/com/ensign/ensigngateway/conf/GlobalResponseLogFilter.java b/ensign-gateway/src/main/java/com/ensign/ensigngateway/conf/GlobalResponseLogFilter.java
new file mode 100644
index 0000000..2b25e69
--- /dev/null
+++ b/ensign-gateway/src/main/java/com/ensign/ensigngateway/conf/GlobalResponseLogFilter.java
@@ -0,0 +1,74 @@
+package com.ensign.ensigngateway.conf;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.server.ServerWebExchange;
+import org.springframework.web.util.UriComponentsBuilder;
+import reactor.core.publisher.Mono;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Description: TODO
+ * @Date: 2024/10/30 9:34
+ * @Created: by ZZSLL
+ */
+
+@Slf4j
+@Configuration
+public class GlobalResponseLogFilter implements GlobalFilter, Ordered {
+
+ @Override
+ public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+ ServerHttpRequest request = exchange.getRequest();
+ // 打印请求路径
+ String path = request.getPath().pathWithinApplication().value();
+ return chain.filter(exchange).then(
+ Mono.fromRunnable(() -> {
+ MultiValueMap queryParams = request.getQueryParams();
+ String requestUrl = UriComponentsBuilder.fromPath(path).queryParams(queryParams).build().toUriString();
+
+ // 构建成一条长日志
+ StringBuilder responseLog = new StringBuilder(200);
+ // 日志参数
+ List