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);
}

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM