CORS跨源資源共享概念及配置(Kubernetes Ingress和Spring Cloud Gateway)
我最新最全的文章都在 南瓜慢說 www.pkslow.com ,歡迎大家來喝茶!
1 跨源資源共享CORS
跨源資源共享 (CORS) (或通俗地譯為跨域資源共享)是一種基於HTTP 頭的機制,該機制通過允許服務器標示除了它自己以外的其它origin(域,協議和端口),這樣瀏覽器可以訪問加載這些資源。
首先要明確的是,瀏覽器訪問資源才會有CORS的存在,如果通過其它HTTP Client等代碼,就不會出現。CORS簡單一點講就是當在瀏覽器地址欄的源Origin與所訪問的資源的地址的源不同,就是跨源了。比如在前後端分離的開發中,UI的地址為//localhost:3000,而服務的地址為//localhost:8080,通過JavaScript獲取服務的數據,就需要跨源。
1.1 預檢preflight
對那些可能對服務器數據產生副作用的 HTTP 請求方法(特別是 GET 以外的 HTTP 請求,或者搭配某些 MIME 類型的 POST 請求),瀏覽器必須首先使用 OPTIONS 方法發起一個預檢請求(preflight request),從而獲知服務端是否允許該跨源請求。服務器確認允許之後,才發起實際的 HTTP 請求。
所以,CORS是需要服務器端打開的一個特性,而不是客戶端。
對於簡單請求,不需要預檢:

預檢一般是通過OPTION方法來進行:

需要注意:
請求的首部中攜帶了 Cookie 信息(credentials:include),如果 Access-Control-Allow-Origin 的值為「*」,請求將會失敗。
2 kubernetes ingress打開CORS
可以在ingress層面打開CORS,而不用在應用層面。配置如下:
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS, DELETE"
nginx.ingress.kubernetes.io/cors-allow-headers: "DNT,X-CustomHeader,X-LANG,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Api-Key,X-Device-Id,Access-Control-Allow-Origin"
當考慮到某些場景不能使allow-origin為*,所以可以按下面這樣配置:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/configuration-snippet: |
more_set_headers "Access-Control-Allow-Origin: $http_origin";
3 spring cloud gateway打開CORS
可以通過配置properties來實現,也可以通過Java配置WebFilter來實現。
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "//www.pkslow.com"
allowedMethods:
- GET
Java的方式大致如下:
@Bean
CorsWebFilter corsWebFilter() {
CorsConfiguration corsConfig = new CorsConfiguration();
corsConfig.setAllowedOrigins(Arrays.asList("//www.pkslow.com"));
corsConfig.setMaxAge(8000L);
corsConfig.addAllowedMethod("PUT");
UrlBasedCorsConfigurationSource source =
new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfig);
return new CorsWebFilter(source);
}
歡迎關注微信公眾號<南瓜慢說>,將持續為你更新…

多讀書,多分享;多寫作,多整理。


