1. 程式人生 > 其它 >CORS跨源資源共享概念及配置(Kubernetes Ingress和Spring Cloud Gateway)

CORS跨源資源共享概念及配置(Kubernetes Ingress和Spring Cloud Gateway)

我最新最全的文章都在 南瓜慢說 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);
}

歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...

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