SpringBoot 跨域解决

66 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

1.跨域

  • 同源策略: 是由 Netscape 提出的一个著名的安全策略,它是浏览器最核心也最基本的安全功能,现在所有支持 JavaScript 的浏览器都会使用这个策略。

  • 同源: 是指协议、域名以及端口要相同。同源策略是基于安全方面的考虑提出来的,这个策略本身没问题,但是我们在实际开发中,由于各种原因又经常有跨域的需求,传统的跨域方案是 JSONP,JSONP 虽然能解决跨域但是有一个很大的局限性,那就是只支持 GET 请求,不支持其他类型的请求。

  • CORS (跨域源资源共享)( CORS,Cross-origin resource sharing): 是一个 W3C 标准,它是一份浏览器技术的规范,提供了 Web 服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略,这是 JSONP 模式的现代版。

2.SpringBoot 解决跨域

二种方法

  • @CrossOrigin 可以加在方法和类上解决跨域 例如: @CrossOrigin(value = "http://localhost:8081")

  • 创建配置类,继承 WebMvcConfigurer 重写 addCorsMappings 方法 @Configuration public class WebMvcConfig implements WebMvcConfigurer {

              @Override
              public void addCorsMappings(CorsRegistry registry) {
                      registry.addMapping("/**")
                      .allowedOrigins("*")
                      .allowedMethods("*")
                      .allowedHeaders("*")
                      .allowCredentials(true);
              }
      
      ○ /** 表示本应用的所有方法都会去处理跨域请求,
      ○ allowedMethods 表示允许通过的请求数,
      ○ allowedHeaders 则表示允许的请求头,
      ○ 经过这样的配置之后,就不必在每个方法上单独配置跨域了。
    

3.存在的问题

了解了整个 CORS 的工作过程之后,我们通过 Ajax 发送跨域请求,虽然用户体验提高了,但是也有潜在的威胁存在,常见的就是 CSRF(Cross-site request forgery)跨站请求伪造。跨站请求伪造也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF,是一种挟制用户在当前已登录的 Web 应用程序上执行非本意的操作的攻击方法,基于此,浏览器在实际操作中,会对请求进行分类,分为简单请求,预先请求,带凭证的请求等,预先请求会首先发送一个 options 探测请求,和浏览器进行协商是否接受请求。默认情况下跨域请求是不需要凭证的,但是服务端可以配置要求客户端提供凭证,这样就可以有效避免 csrf 攻击。