Web | Springboot解决跨域
深入讲解:cors
一、跨域是什么
当我们使用AJAX请求其他域名(即不是同协议 同域名 同端口)的情况下,会出现拒绝访问的情况。
比如:你的网站域名是localhost:8888
,想要访问localhost:6666
中的内容浏览器是不允许的。
二、为什么跨域请求获取不到数据
我们浏览器有同源政策,这是因为基于安全的考虑,AJAX只能访问本地的资源,而不能跨域访问。
但如果是form表单中则是可以的,比如
form表单
localhost:8888中的html页面,可以访问到:
<button id="myButton">点我</button>
<form action="localhost:8888/" method="get">
<input type="password" name="password">
<input type="submit" value="提交">
</form>
ajax
不可以访问到:
request.open('GET', 'localhost:8888/')
原因:
原页面用 form 提交到另一个域名之后,原页面的脚本无法获取新页面中的内容,所以浏览器认为这是安全的;
AJAX 是可以读取响应内容的,因此浏览器不能允许你这样做。如果你细心的话你会发现,其实请求已经发送出去了,你只是拿不到响应而已,下面会详解。
所以浏览器这个策略的本质是,一个域名的 JS ,在未经允许的情况下,不得读取另一个域名的内容。但浏览器并不阻止你向另一个域名发送请求。
三、springboot解决方案
服务端来解决跨域的本质就是在响应头中加入允许跨域的信息
Access-Control-Allow-Origin:允许跨域访问本服务的请求地址
,让浏览器允许跨域
3.1 方式一
在方法或类上加 @CrossOrigin(origins="url")
url表示支持跨域访问本服务的其它地址。
3.2 方式二
进行额外配置
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
/**
* 跨域支持配置
*
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") //指定允许跨域的接口
.allowCredentials(true)
.allowedHeaders("*")//指定允许对本服务跨域访问的地址的请求头信息
.allowedOrigins("*") //指定允许对本服务跨域访问的地址
.allowedMethods("*") //指定本服务中支持跨域的方法类型,如get、put。。。。
.maxAge(30 * 1000); // put会在正式发送请求之前,发一个探测请求,看是否支持跨域,这个就是设置探测请求有效时间,在有效时间内如果出现跨域,可以不用发送探测请求。
//后端设置跨域逻辑,响应跨域信息,告诉浏览器允许跨域请求
}
}
3.3 方法三
/**
* 跨域支持
*/
@Configuration
public class CorsConfig {
private static final String MAX_AGE = "18000L";
@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);
}
}
3.4 方法四
@Configuration
public class WebConfig {
/**
* 跨域请求支持
*/
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*")
.allowedMethods("*").allowedHeaders("*")
.allowCredentials(true)
.exposedHeaders(HttpHeaders.SET_COOKIE).maxAge(3600L);
}
};
}
}