CORS跨源資源共享概念及配置(Kubernetes Ingress和Spring Cloud Gateway)
阿新 • • 發佈:2021-06-29
我最新最全的文章都在 南瓜慢說 www.pkslow.com ,歡迎大家來喝茶!
1 跨源資源共享CORS
跨源資源共享 (CORS) (或通俗地譯為跨域資源共享)是一種基於HTTP 頭的機制,該機制通過允許伺服器標示除了它自己以外的其它origin(域,協議和埠),這樣瀏覽器可以訪問載入這些資源。
首先要明確的是,瀏覽器訪問資源才會有CORS
的存在,如果通過其它HTTP Client
等程式碼,就不會出現。CORS
簡單一點講就是當在瀏覽器位址列的源Origin
與所訪問的資源的地址的源不同,就是跨源了。比如在前後端分離的開發中,UI
的地址為http://localhost:3000
,而服務的地址為http://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: "https://www.pkslow.com"
allowedMethods:
- GET
Java的方式大致如下:
@Bean
CorsWebFilter corsWebFilter() {
CorsConfiguration corsConfig = new CorsConfiguration();
corsConfig.setAllowedOrigins(Arrays.asList("https://www.pkslow.com"));
corsConfig.setMaxAge(8000L);
corsConfig.addAllowedMethod("PUT");
UrlBasedCorsConfigurationSource source =
new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfig);
return new CorsWebFilter(source);
}
歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...
多讀書,多分享;多寫作,多整理。