在前后端分离的项目中,在后端没配置任何的情况下,前端去请求都会报出跨域问题。
产生跨域的原因:浏览器同源策略。协议、ip、端口不一致都会导致跨域。
跨域解决方案通常有如下几种:
在网关和在子项目设置的区别:在网关设置相对比较统一,专业的人干专业的事,而后期项目多了,每个项目都需要配置比较麻烦,子项目只需要关注业务就行。
代理和请求头设置跨域的区别:代理是模拟同源策略,前提条件是前端打包后在同一个域名下,这样相对安全。
本文主要讲到SpringCloud Gateway 来设置请求头来允许跨域。
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class CrossOriginFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpResponse response = exchange.getResponse();
HttpHeaders headers = response.getHeaders();
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "POST, GET, PUT, OPTIONS, DELETE, PATCH");
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");
headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
return chain.filter(exchange);
}
}