1. 概念
这是浏览器安全方面的考虑
(1) 出于浏览器的同源策略限制。
同源即相同的主机(host)/域名、端口号(port) 协议(protocol)
当一个请求url的协议、主机(host)/域名、端口三者之间任意一个与当前页面url不同即为跨域
(2) 不同源的资源访问不了
【1】 Cookie、LocalStorage 和 IndexedDB
【2】 DOM
【3】发送 AJAX 请求
(4) 常用的解决方案是CORS
CORS 是跨域资源分享(Cross-Origin Resource Sharing)的缩写。它是 W3C 标准,属于跨源 AJAX 请求的根本解决方法。
1、普通跨域请求:只需服务器端设置Access-Control-Allow-Origin
2、带cookie跨域请求:前后端都需要进行设置
【前端设置】根据xhr.withCredentials字段判断是否带有cookie
【服务端设置】
服务器端对于CORS的支持,主要是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。
2. 解决gateway组件跨域问题
方式1:
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
方式2:
// @Bean
// public WebFilter corsFilter() {
// return (ServerWebExchange ctx, WebFilterChain chain) -> {
// ServerHttpRequest request = ctx.getRequest();
// if (!CorsUtils.isCorsRequest(request)) {
// return chain.filter(ctx);
// }
// HttpHeaders requestHeaders = request.getHeaders();
// ServerHttpResponse response = ctx.getResponse();
// HttpMethod requestMethod = requestHeaders.getAccessControlRequestMethod();
// HttpHeaders headers = response.getHeaders();
// headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, requestHeaders.getOrigin());
// headers.addAll(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders.getAccessControlRequestHeaders());
// if (requestMethod != null) {
// headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, requestMethod.name());
// }
// headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
// headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
// headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, MAX_AGE);
// if (request.getMethod() == HttpMethod.OPTIONS) {
// response.setStatusCode(HttpStatus.OK);
// return Mono.empty();
// }
// return chain.filter(ctx);
// };
// }
//
方式3
spring:
cloud:
gateway:
discovery:
locator:
enabled: false #开启从注册中心动态创建路由的功能
lower-case-service-id: true #使用小写服务名,默认是大写
# CORS配置
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods:
- GET
- HEAD
- POST
- PUT
- DELETE
- TRACE
- OPTIONS
- PATCH
allowedHeaders: "*"
即可