关于java:CORS跨源资源共享概念及配置Kubernetes-Ingress和Spring-Cloud-Gateway

32次阅读

共计 2068 个字符,预计需要花费 6 分钟才能阅读完成。

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

欢送关注微信公众号 <南瓜慢说>,将继续为你更新 …

多读书,多分享;多写作,多整顿。

正文完
 0