Explorar o código

全局跨域处理

chao %!s(int64=4) %!d(string=hai) anos
pai
achega
3cdc7ed721

+ 1 - 1
caimei365-cloud-config/src/main/resources/application.yml

@@ -14,7 +14,7 @@ spring:
           password: caimei_code
           clone-on-start: true #开启启动时直接从git获取配置
           search-paths: /**  # 指定搜索根路径下的所有目录,若有多个路径使用逗号隔开
-          basedir: D:\_PLAN_WORKSPACE\caimei365-cloud-config-files  # 本地git仓库的路径
+          # basedir: D:\_PLAN_WORKSPACE\caimei365-cloud-config-files  # 本地git仓库的路径
 
 
 # 指定服务注册中心的地址

+ 37 - 0
caimei365-cloud-gateway/src/main/java/com/caimei365/cloud/config/GlobalCorsConfiguration.java

@@ -0,0 +1,37 @@
+package com.caimei365.cloud.config;
+
+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;
+import org.springframework.web.util.pattern.PathPatternParser;
+
+/**
+ * 全局跨域配置
+ *
+ * @author : Charles
+ * @date : 2021/3/24
+ */
+@Configuration
+public class GlobalCorsConfiguration {
+
+    @Bean
+    public CorsWebFilter corsFilter() {
+        CorsConfiguration config = new CorsConfiguration();
+        config.addAllowedOriginPattern("*");
+        config.addAllowedMethod("*");
+        config.addAllowedHeader("*");
+        config.setAllowCredentials(true);
+        config.addExposedHeader("Content-Type");
+        config.addExposedHeader("X-Requested-With");
+        config.addExposedHeader("accept");
+        config.addExposedHeader("Origin");
+        config.addExposedHeader("Access-Control-Request-Method");
+        config.addExposedHeader("Access-Control-Request-Headers");
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
+        source.registerCorsConfiguration("/**", config);
+
+        return new CorsWebFilter(source);
+    }
+}

+ 43 - 0
caimei365-cloud-gateway/src/main/java/com/caimei365/cloud/config/WebConfiguration.java

@@ -0,0 +1,43 @@
+package com.caimei365.cloud.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.stereotype.Component;
+import org.springframework.web.reactive.config.WebFluxConfigurer;
+import org.springframework.web.server.ServerWebExchange;
+import org.springframework.web.server.WebFilter;
+import org.springframework.web.server.WebFilterChain;
+import reactor.core.publisher.Mono;
+
+import java.net.InetSocketAddress;
+import java.util.Objects;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/3/24
+ */
+@Configuration
+public class WebConfiguration implements WebFluxConfigurer {
+
+    /**
+     * https://stackoverflow.com/questions/51192630/how-do-you-get-clients-ip-address-spring-webflux-websocket?rq=1
+     * https://stackoverflow.com/questions/50981136/how-to-get-client-ip-in-webflux
+     * https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-filters
+     * 由于在低版本的 spring-webflux 中不支持直接获得请求 IP(https://jira.spring.io/browse/SPR-16681),
+     * 因此从org.springframework.web.server.ServerWebExchange中获得 IP 后,在放到 header 里
+     */
+    @Component
+    public static class RetrieveClientIpWebFilter implements WebFilter {
+        @Override
+        public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
+            InetSocketAddress remoteAddress = exchange.getRequest().getRemoteAddress();
+            String clientIp = Objects.requireNonNull(remoteAddress).getAddress().getHostAddress();
+            ServerHttpRequest mutatedServerHttpRequest = exchange.getRequest().mutate().header("X-CLIENT-IP", clientIp).build();
+            ServerWebExchange mutatedServerWebExchange = exchange.mutate().request(mutatedServerHttpRequest).build();
+            return chain.filter(mutatedServerWebExchange);
+        }
+    }
+
+}