Spring boot 跨域

  1.同源策略

同源策略是由 Netscape 提出的一个著名的安全策略,它是浏览器最核心也最基本的安全功能,现在所有支持JavaScript的浏览器都会使用这个策略。
所谓同源是指协议、域名以及端口要相同。同源策略是基于安全方面的考虑提出来的,这个策略本身没问题,但是我们在实际开发中,由于各种原因又经常有跨域的需求,
传统的跨域方案是JSONP,JSONP虽然能解决跨域但是有一个很大的局限性,那就是只支持GET请求,不支持其他类型的请求,而今天我们说的CORS(跨域源资源共享)
(CORS,Cross-origin resource sharing)是一个W3C标准,它是一份浏览器技术的规范,提供了Web服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略,
这是JSONP模式的现代版。

(1)可以通过@CrossOrigin注解配置某一个方法接受某一个域的请求,如下:

@RestController
public class HelloController {

  @CrossOrigin(value = "http://localhost:8081")
  @GetMapping("/hello")
  public String hello(){
    return "hello";
  }

  @CrossOrigin(value = "http://localhost:8081")
  @PostMapping("/hello")
  public String hello2(){
    return "hello";
  }
}

(2)还可以通过全局配置一次性解决这个问题,全局配置只需要在配置类中重写addCorsMappings方法即可
@Configuration
public class WebMveConfig implements WebMveConfigurer{
  @Override
  public void addCorsMappings(CorsRegistry registry){
    registry.addMapping("/**")
    .allowedOrigins("http://localhost:8081")
    .allowedMethods("*")
    .allowedHeaders("*");
  }
}

/**表示本应用的所有方法都会去处理跨域请求,allowedMethods表示允许通过的请求数,allowedHeaders则表示允许的请求头。经过这样的配置之后,就不必在每个方法上单独配置跨域了。

(3)启动类添加bean
@Bean
public CorsFilter corsFilter() {
  final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
  final CorsConfiguration config = new CorsConfiguration();
  config.setAllowCredentials(true);
  config.addAllowedOrigin("*");
  config.addAllowedHeader("*");
  config.addAllowedMethod("OPTIONS");
  config.addAllowedMethod("HEAD");
  config.addAllowedMethod("GET");
  config.addAllowedMethod("PUT");
  config.addAllowedMethod("POST");
  config.addAllowedMethod("DELETE");
  config.addAllowedMethod("PATCH");
  source.registerCorsConfiguration("/**", config);
  return new CorsFilter(source);
}


2.存在的问题

了解了整个CORS的工作过程之后,我们通过Ajax发送跨域请求,虽然用户体验提高了,但是也有潜在的威胁存在,常见的就是CSRF(Cross-site request forgery)跨站请求伪造。

跨站请求伪造也被称为one-click attack 或者 session riding,通常缩写为CSRF或者XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法,举个例子:
假如一家银行用以运行转账操作的URL地址如下: http://icbc.com/aa?bb=cc,那么,一个恶意攻击者可以在另一个网站上放置如下代码: <imgsrc="http://icbc.com/aa?bb=cc">,
如果用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会遭受损失。基于此,浏览器在实际操作中,会对请求进行分类,分为简单请求,预先请求,
带凭证的请求等,预先请求会首先发送一个options探测请求,和浏览器进行协商是否接受请求。默认情况下跨域请求是不需要凭证的,但是服务端可以配置要求客户端提供凭证,
这样就可以有效避免csrf攻击。

原文地址:https://www.cnblogs.com/smj1990/p/11739140.html