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