Spring Cloud Gateway 处理重复Header的方法(CORS policy: The ‘Access-Control-Allow-Origin‘ header has a……
问题现状
首先发现问题的原始点是浏览器进行 ajax 请求的时候出现跨域问题,经查看请求报文和错误确定是 Access-Control-Allow-Origin 出现了多个值(浏览器目前是不允许的),其原因是是在 gateway 中配置过了 Access-Control-Allow-Origin,后端服务的开发人员也配置了 Access-Control-Allow-Origin,导致 response 在响应的时候 Access-Control-Allow-Origin 出现了多个值(不管两个值相同还是不同浏览器目前都会报错),截图如下:
解决该问题的思路:
- 有可能配置了多处跨域,可以将所有后端服务的跨域处理都去除,交网关统一处理
- 可以将网关的处理去除(那么后端所有服务都需要添加)
- 在网关做去重处理,只保留一个值响应给浏览器(这是本文选择的处理方法)
解决方法:在application.properties或bootstrap.properties配置文件中添加如下的配置
# 这一段配置是处理跨域的 spring.cloud.gateway.globalcors.cors-configurations.[/**].allow-credentials=true spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-headers[0]=* spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-methods[0]=* spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-origins[0]=http://localhost:8080 spring.cloud.gateway.globalcors.cors-configurations.[/**].max-age=1800 # 相同header多个值时的处理方式,三种规则可选(RETAIN_FIRST(保留第一个)|RETAIN_UNIQUE(保留独特的)|RETAIN_LAST(保留最后的)) spring.cloud.gateway.default-filters[0]=DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST