问题现状
首先发现问题的原始点是浏览器进行 ajax 请求的时候出现跨域问题,经查看请求报文和错误确定是 Access-Control-Allow-Origin
出现了多个值(浏览器目前是不允许的),其原因是是在 gateway 中配置过了 Access-Control-Allow-Origin
,后端服务的开发人员也配置了 Access-Control-Allow-Origin
,导致 response 在响应的时候 Access-Control-Allow-Origin
出现了多个值(不管两个值相同还是不同浏览器目前都会报错),截图如下:
解决该问题的思路:
- 可以将所有后端服务的跨域处理都去除,交网关统一处理
- 可以将网关的处理去除(那么后端所有服务都需要添加)
- 在网关做去重处理,只保留一个值响应给浏览器(这是本文选择的处理方法)
解决方法
请先确定你使用版本的 gateway 中是否有 DedupeResponseHeaderGatewayFilterFactory
类,其实看完这句话,正常来说你会看一下这个类的代码,那么不出意外的话你应该已经知道怎么做了。
下面是具体的配置示例:
# 这一段前面的配置是处理跨域的,本文处理重复header的请看最后一条配置
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
如上三种可选规则的含义:顾名思义
注:本文虽然是以跨域问题为例并提供了解决方法,实际上 DedupeResponseHeader
是可以处理任意Header的,并不局限于跨域Header的处理。
(END)