SpringBoot如何设置允许跨域
何为跨域
跨域,指的是浏览器不能执行其他网站的脚本,是由浏览器的同源策略造成的,是浏览器施加的安全限制。所谓同源是指,域名,协议,端口均相同。 以下几种都可以称为跨域
例如:
http://goshare.site/test/index.html 调用 http://goshare.site/test/server (非跨域)
http://goshare.site/test/index.html 调用 http://www.baidu.com/test/server (主域名不同,跨域)
http://goshare.site/test/index.html 调用 https://goshare.site/test/server (协议不同,跨域)
http://127.0.0.1:8010/test/index.html 调用 http://127.0.0.1:8011/test/server (端口不同,跨域)
注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域,同理域名和域名对应的ip也属于跨域。
常见解决办法
- JSONP
原理:动态添加一个
<script>
标签,而script标签的src属性是没有跨域的限制的。
优势:
(1)它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制。
(2)它的兼容性更好,在更加古老的浏览器中都 可以运行,不需要XMLHttpRequest或ActiveX的支持。
(3)并且在请求完毕后可以通过调用callback的方式回传结果。
缺势:
(1)只支持GET请求而不支持POST等其它类型的HTTP请求。(重点之处)
(2)只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。
- CORS
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源(协议 + 域名 + 端口)服务器,发出XMLHttpRequest请求,从而克服了Ajax只能同源使用的限制。
优势:
(1)CORS支持所有类型的HTTP请求,功能完善。(重点)
(2)CORS可以通过onerror事件监听错误,并且浏览器控制台会看到报错信息,利于排查。
(3)CORS算是个跨域规范,在资源访问授权方面进行了限制(Access-Control-Allow-Origin),而且标准浏览器都做了安全限制。
Springboot遇到的问题
前后端分离的跨域访问
解决办法
采用CORS的配置方法:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class GlobalCorsConfig {
@Bean
public CorsFilter corsFilter() {
//1.添加CORS配置信息
CorsConfiguration config = new CorsConfiguration();
//放行哪些原始域
config.addAllowedOrigin("*");
//是否发送Cookie信息
config.setAllowCredentials(true);
//放行哪些原始域(请求方式)
config.addAllowedMethod("*");
//放行哪些原始域(头部信息)
config.addAllowedHeader("*");
//暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息) //
config.addExposedHeader("*");
//2.添加映射路径
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
//3.返回新的CorsFilter.
return new CorsFilter(configSource);
}
}