SpringBoot如何设置允许跨域

交流  收藏
0 / 1599

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也属于跨域。

常见解决办法

  1. JSONP 原理:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。

优势:

(1)它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制。

(2)它的兼容性更好,在更加古老的浏览器中都 可以运行,不需要XMLHttpRequest或ActiveX的支持。

(3)并且在请求完毕后可以通过调用callback的方式回传结果。

缺势:

(1)只支持GET请求而不支持POST等其它类型的HTTP请求。(重点之处)

(2)只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。

  1. 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);  
    }  
}
goshare小助手
tomcat的猫