我最新最全的文章都在 南瓜慢说 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);
}
欢送关注微信公众号 <南瓜慢说>,将继续为你更新 …
多读书,多分享;多写作,多整顿。