现代浏览器出于安全的考虑,HTTP 请求时必须遵守同源策略,否则就是跨域的HTTP 请求,默认情况下是被禁止的,IP (域名)不同或者端口不同、协议不同(比如HTTP 、HTTPS ) 都会造成跨域问题。
一般前端的解决方案有:
1、用JSONP 来支持跨域的请求,JSONP 实现跨域请求的原理简单的说,就是动态创建< script >标签,然后利用< script> 的SRC 不受同源策略约束来跨域获取数据。缺点是需要后端配合输出特定的返回信息。
2、利用反向代理的机制来解决跨域的问题,前端请求的时候先将请求发送到同源地址的后端,通过后端请求转发来避免跨域的访问。
后来HTML5 支持了CORS 协议。CORS 是一个W3C标准,全称是" 跨域资源共享" ( Cross-origin resource sharing) ,允许浏览器向跨域服务器,发出XMLHttpRequest 请求,从而克服了AJAX 只能同源使用的限制.它通过服务器增加一个特殊的Header[Access-Contro1- Allow-Origin) 来告诉客户端跨域的限制,如果浏览器支得CORS 、并且判断。Origin通过的话,就会允许XMLHttpReq uest 发远跨域请求。
前端使用了CORS 协议,就需要后端设重支持非同源的请求, Spring Boot 设置支持非同源的请求有两种方式。
第一种, 配置CorsFilter
@Configuration
public class GlobalCorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAIIowedOrigin("*");
config.setAllowCredentials(true);
config.addAIIowedMethod("*");
config.addAllowedHeader("*");
config.addExposedHeader("*");
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
return new CorsFilter(configSource);
}
}
第二种,相对简单一点
public class Application extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowCredentials(true)
.allowedHeaders("*")
.allowedOrigi ns("*")
.allowedMethods("*");
}
}