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 出现了多个值(不管两个值相同还是不同浏览器目前都会报错),截图如下:
Spring Cloud Gateway 处理重复Header的方法(CORS policy: The ‘Access-Control-Allow-Origin‘ header has a……_第1张图片

解决该问题的思路:

  • 可以将所有后端服务的跨域处理都去除,交网关统一处理
  • 可以将网关的处理去除(那么后端所有服务都需要添加)
  • 在网关做去重处理,只保留一个值响应给浏览器(这是本文选择的处理方法

解决方法
请先确定你使用版本的 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)

你可能感兴趣的:(Spring,Boot)