zoukankan      html  css  js  c++  java
  • 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攻击。

  • 相关阅读:
    JavaWeb(一)
    有趣的天平秤假币问题
    栈应用——逆波兰式表达式的值
    栈应用——最长括号匹配
    倾力总结40条常见的移动端Web页面问题解决方案
    Emmet:HTML/CSS代码快速编写神器
    我的 Github 个人博客是怎样炼成的
    解决mac下atom安装插件失败问题
    Github建站全攻略
    OS X快捷键最最齐全版(官方版)
  • 原文地址:https://www.cnblogs.com/smj1990/p/11739140.html
Copyright © 2011-2022 走看看