Gateway网关跨域问题
在使用Gateway网关时,所有请求先通过网关转发,这就有可能出现跨域问题
上面的跨域报错是因为8001
端口的请求去访问88
端口的网关,导致了跨域,这是由于浏览器的同源策略造成的
同源策略是指协议、域名、端口都要相同,只要其中有一个不同都会产生跨域问题
跨域流程
非简单请求(PUT、DELETE)等,需要先发送预检请求,只要当想要访问的服务器允许跨域时,才可以发送真实请求
解决跨域
使用Nginx部署为同一域
将前端和后端项目都部署在Nginx服务器,浏览器的静态请求和动态请求都会去访问Nginx的地址,然后由Nginx反向代理给不同的服务
配置当次请求允许跨域
给请求添加响应头
Access-Control-Allow-Origin
: 支持哪些来源的请求跨域Access-Control-Allow-Method
: 支持那些方法跨域Access-Control-Allow-Credentials
:跨域请求默认不包含cookie
,设置为true
可以包含cookie
Access-Control-Max-Age
:表明该响应的有效时间为多少秒。在有效时间内,浏览器无须为同一请求再次发起Access-Control-Expose-Headers
: 跨域请求暴露的字段
CORS
请求时,XMLHttpRequest
对象的getResponseHeader()
方法只能拿到6个基本字段:
Cache-Control
、Content-Language
、Content-Type
、Expires
、Last-Modified
、Pragma
如果想拿到其他字段,就必须在Access-Control-Expose-Headers
里面指定。
在Gateway
网关中统一配置跨域
@Configuration
public class CorsConfig {
//添加跨域过滤器
@Bean
public CorsWebFilter corsWebFilter() {
// 基于url跨域
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// 跨域配置信息
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.setAllowCredentials(true);
// 向source中注册new出来的配置,并设置任意url都要进行跨域配置
source.registerCorsConfiguration("/**", corsConfiguration);
return new CorsWebFilter(source);
}
}
此时登录请求先发送了预检请求,在响应头中添加了允许跨域的字段
第二次才是发送的真实的请求,网关88
端口允许8001
端口发送请求