gateway 跨域 CORS

在项目微服务改造中,引入Spring Cloud Gateway后遇到浏览器访问异常,而Postman正常的问题。原来是CORS配置冲突导致。通过添加自定义CORS配置和过滤器,解决了Vue浏览器跨域问题。具体解决方案包括在配置类中设置CORS允许所有源,并添加过滤器确保响应头正确设置。

        项目微服务改造,增加gateway后发现出现神奇问题: postman可以访问,vue浏览器访问不了。不通过gateway直接访问原项目就可以。

        原项目跨域是通过webmvc 解决的 ,但是gateway 有个包和这个冲突。所以开始在网上找通过gateway解决的办法。

        原来通过浏览器看到一个请求会有两个记录,都报错,如下图。

后来通过网上搜到下面代码加上后,其中xhr的请求返回200 但是没有响应内容。在xhr.js请求中能看到返回值,好神奇。

 CORS Allow Origin Not Matching Origin

access-control-allow-origin

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;

import com.idealeye.gateway.filter.Cor
### 网关配置方案 对于网关中的配置,特别是当希望排除某些路径或服务不受限制时,可以通过调整 `spring.cloud.gateway.globalcors` 配置来实现。全局CORS源资源共享)设置可以应用到所有路由上,但如果想要针对特定路径实施不同的策略,则需采用局部配置的方式。 #### 排除特定路径的限制 要使某些路径不受到规则的影响,可以在定义这些路径对应的路由时不指定任何 CORS 相关属性。这样做的效果是让该路径遵循浏览器默认行为处理请求,即不做特殊处理[^2]。 ```yaml spring: cloud: gateway: routes: - id: non_cors_route uri: lb://example-service predicates: - Path=/api/non-cors/** ``` 上述例子展示了如何创建一条名为 `non_cors_route` 的路由规则,它指向的服务不会被施加额外的约束,因为这里并没有为这条路线设定任何 CORS 参数。 #### 对其他路径启用并定制化支持 而对于那些确实需要访问权限的路径和服务来说,在其各自的路由条目下加入具体的 CORS 设置即可满足需求: ```yaml spring: application: name: gateway cloud: nacos: config: server-addr: 127.0.0.1:8848 gateway: globalcors: cors-configurations: '[/**]': allowCredentials: true allowedHeaders: "*" allowedOriginPatterns: "http://localhost:*" allowedMethods: "*" routes: - id: cors_enabled_route uri: lb://another-service predicates: - Path=/api/cors-enabled/** filters: - AddRequestHeader=Access-Control-Allow-Origin, http://specific.origin.com ``` 此段配置中,除了设置了全局的 CORS 政策外,还特别指定了一个带有自定义响应头 (`AddRequestHeader`) 过滤器的路由 `cors_enabled_route` ,这使得只有来自 `http://specific.origin.com` 的请求能够成功通过验证。 #### 使用通配符模式精确控制允许的来源 值得注意的是,如果使用了 `allowCredentials: true` 并且需要携带凭证的话,那么就不能再简单地使用 `allowedOrigins` 来接受所有的原始站点;相反,应该利用 `allowedOriginPatterns` 提供更灵活的选择机制,从而确保安全性的同时也达到了预期的功能目的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值