跨域请求是什么?
非跨域请求必须同时满足三个条件:
- 协议: 协议必须相同,比如都是
http
或都是https
。 - 域名: 域名必须完全相同,包括子域名。例如,
www.a.com
和a.com
被视为不同的域名。 - 端口号: 如果指定了端口号,则端口号也必须相同。
以上三个条件必须同时满足,有一个不满足就属于跨域请求。
例如:
1.http://www.a.com/1.html
,目标资源的URL为http://www.a.com/2.html
(属于第一点协议不同)
2.http://www.b.com/3.html
(属于第二点域名不同)
3.http://www.a.com:8080/data
(属于第三点端口号不同)。
服务器如何知道是不是跨域?
HTTP请求有一个origin字段,字段内部记录了协议、域名、端口号。当发起请求的时候,接收方服务器可依据这三个字段来判断是否发生了跨区请求。
如何解决跨域问题?
以后端框架springboot为例,需要设置CORS响应头。
例如:
Access-Control-Allow-Origin:允许的来源
Access-Control-Allow-Methods:允许的方法
Access-Control-Allow-Headers:允许的请求头
@Bean
public CorsFilter corsFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
//1,允许任何来源
corsConfiguration.setAllowedOriginPatterns(Collections.singletonList("*"));
//2,允许任何请求头
corsConfiguration.addAllowedHeader(CorsConfiguration.ALL);
//3,允许任何方法
corsConfiguration.addAllowedMethod(CorsConfiguration.ALL);
//4,允许凭证
corsConfiguration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(source);
}