Spring Cloud Gateway 处理重复Header的方法(CORS policy: The ‘Access-Control-Allow-Origin‘ header has a……

超、凢脫俗 2022-12-02 12:19 148阅读 0赞

问题现状
首先发现问题的原始点是浏览器进行 ajax 请求的时候出现跨域问题,经查看请求报文和错误确定是 Access-Control-Allow-Origin 出现了多个值(浏览器目前是不允许的),其原因是是在 gateway 中配置过了 Access-Control-Allow-Origin,后端服务的开发人员也配置了 Access-Control-Allow-Origin,导致 response 在响应的时候 Access-Control-Allow-Origin 出现了多个值(不管两个值相同还是不同浏览器目前都会报错),截图如下:
在这里插入图片描述

解决该问题的思路:

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

解决方法
请先确定你使用版本的 gateway 中是否有 DedupeResponseHeaderGatewayFilterFactory 类,其实看完这句话,正常来说你会看一下这个类的代码,那么不出意外的话你应该已经知道怎么做了。
下面是具体的配置示例:

  1. # 这一段前面的配置是处理跨域的,本文处理重复header的请看最后一条配置
  2. spring.cloud.gateway.globalcors.cors-configurations.[/**].allow-credentials=true
  3. spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-headers[0]=*
  4. spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-methods[0]=*
  5. spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-origins[0]=http://localhost:8080
  6. spring.cloud.gateway.globalcors.cors-configurations.[/**].max-age=1800
  7. # 相同header多个值时的处理方式,三种规则可选(RETAIN_FIRST|RETAIN_UNIQUE|RETAIN_LAST)
  8. spring.cloud.gateway.default-filters[0]=DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST

如上三种可选规则的含义:顾名思义

注:本文虽然是以跨域问题为例并提供了解决方法,实际上 DedupeResponseHeader 是可以处理任意Header的,并不局限于跨域Header的处理。


(END)

发表评论

表情:
评论列表 (有 0 条评论,148人围观)

还没有评论,来说两句吧...

相关阅读