什么是Gateway
在微服务架构Springf Cloud
庞大的体系中,网关Gateway
起着不可或缺的作用,目前很多项目都是采用前后端分离的架构,前端需要配置接口路径,当业务功能繁多的时候,接口路径也会特别多,这时我们可以配置GateWay
来减轻前端工程师的压力。
Gateway
中的三大核心概念:路由、断言、过滤器
路由:由id,uri,断言predicates
组成
断言::路由的匹配规则
过滤器: 在进入路由前后对请求进行修改
首先客户端发送的任何请求,网关都会把它们拦住。根据请求的URL不同分配到不同的路由上,路由中有断言,会对请求的url进行匹配,匹配成功返回true
否则返回false
,匹配断言成功后后进入路由,之后会有一系列的过滤器全局过滤器GlobalFilter网关过滤器GatewayFilter
对请求进行修改。具体怎么修改需要看业务场景。
什么是跨域?
当一个请求与当前页面的URL、域名、端口不同时会出现跨域问题
举个例子吧:
当前页面地址 | 被请求页面地址 | 是否跨域 | 原因 |
---|---|---|---|
http://www.test.com/index.html | http://www.test.com/index.html | 否 | 同源相同 |
http://www.baidu.com/ | https://www.test.com/ | 是 | 协议不同 |
http://www.baidu.com/ | http://www.test.com/ | 是 | 主域名不同 |
http://www.test.com/ | http://flag.test.com/ | 是 | 子域名不同 |
http://www.baidu.com/ | http://www.test.com:8080/ | 是 | 端口不同 |
跨域问题展示
可以看到当前页面的url为http://localhost:63342/cloud/cloud-gateway-9527/index.html?_ijt=58f0nf0tl6j2e5bn173ph5ajg
被请求页面的url为http://localhost:9527/payment/
这很明显是端口不同出现了跨域问题
当报错信息为
XMLHttpRequest
或者No 'Access-Control-Allow-Origin'
不用怀疑就是出现了跨域
![]()
如何解决跨域?
常见的用于解决跨域问题的方法就是CORS
了,相信学过Spring Security
的朋友对CORS
并不陌生
拓展:
在做后台管理系统时实现权限控制与安全认证会用到Spring Security
在Spring Security·的配置类中添加http.cors();
也就是开启跨域访问还有http.csrf().disable();
关闭csrf防护
CORS
是跨域资源共享,是解决跨域问题很好的一种解决方案
只需在application.yml
文件加入以下配置即可,application.properties
文件也是这段配置,但需要遵循指定的编码风格
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
allowCredentials: true
allowedOriginPatterns: "*"
allowedMethods: "*"
allowedHeaders: "*"
add-to-simple-url-handler-mapping: true
可以看到页面可以正常访问了也不会报跨域的错误了