在前后端分离的项目中,在后端没配置任何的情况下,前端去请求都会报出跨域问题。
产生跨域的原因:
浏览器同源策略。协议、ip、端口不一致都会导致跨域。
跨域解决方案通常有如下几种:
Nginx层面解决:添加请求头或者反向代理来模拟同源;
前端层面解决:
如Vue中的配置文件proxy原理也是通过反向代理、或者通过JSONP来解决;
后端层面解决:
1、 SpringBoot中的Crossorigin注解(缺点:每个类都需要加);
2、 SpringBoot通过过滤器设置请求头;
3、 SpringBoot通过拦截器设置请求头;
4、 SpringBoot设置Mvc的请求头;
5、 微服务网关反向代理的方式;
6、 微服务网关设置请求头;
在网关和在子项目设置的区别:在网关设置相对比较统一,专业的人干专业的事,而后期项目多了,每个项目都需要配置比较麻烦,子项目只需要关注业务就行。
代理和请求头设置跨域的区别:代理是模拟同源策略,前提条件是前端打包后在同一个域名下,这样相对安全。
本文主要讲到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);
}
}