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