Spring Cloud Version:Spring Cloud 2021.0.4
Spring Cloud Gateway Version:3.1.4
Spring Boot Version:2.6.11
1、網關跨域問題說明
關於跨域的相關原理和理論,網上有大量文章對此進行說明,因此博主在這裏就不再贅述,這裏僅說明對於在同一註冊中心中註冊的服務,網關可以通過在註冊中心註冊的服務名對相應請求找到對應的服務進行路由轉發,因此這種情況,不存在跨域問題,但是對於一些通過Nginx反向代理到網關服務下的請求進行訪問時,就存在了跨域問題,所以下面網關配置也是針對此部分問題進行解決。
2、網關跨域解決
針對網關跨域解決,這裏提供兩種解決方案,僅供參考,下面配置均在線上環境測試通過,關於其他版本,僅供參考!
2.1、方案一:網關注入配置類
Spring Cloud Gateway提供了跨域的配置類,然後在網關項目代碼中添加一個CorsWebFilter類即可實現,關於網關提供的Cors配置類,可參看官方文檔(https://docs.spring.io/spring-framework/docs/5.0.x/javadoc-api/org/springframework/web/cors/CorsConfiguration.html)
@Configuration
public class GlobalCorsConfig {
@Bean
public CorsWebFilter corsWebFilter() {
CorsConfiguration config = new CorsConfiguration();
// 這裏僅爲了說明問題,配置爲放行所有域名,生產環境請對此進行修改
config.addAllowedOrigin("*");
// 放行的請求頭
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);
}
}
Spring Cloud Gateway 也提供了可以直接通過在yaml文件中配置的方式解決跨域問題,具體的類配置可以查看源碼中對應的類org.springframework.cloud.gateway.config.GlobalCorsProperties,源碼地址如下:
網關yaml配置如下:
spring:
cloud:
gateway:
# 網關全局跨域配置
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods: "*"
allowedHeaders: "*"
allowCredentials: true
# 解決options請求被攔截的問題
add-to-simple-url-handler-mapping: true