zoukankan      html  css  js  c++  java
  • CORS在Spring中的实现

    CORS:

    通常情况下浏览器禁止AJAX从外部获取资源,因此就衍生了CORS这一标准体系,来实现跨域请求。

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源(协议 + 域名 + 端口)服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制.

    跨域请求在java spring MVC中的实现:

    Spring MVC HandlerMapping 接口对CORS提供了一个内部支持,在成功的映射到一个处理器的请求之后,HanderMapping接口检查CORS的请求配置文件,然后采取下一步行动,预检(Preflight)请求能够被直接的处理,而简单和直接的CORS请求将会被拦截和经过验证,同时还需要CORS请求头的进一步设置。因此,为了确保能够实现跨域请求,在请求头中会加入Origin这一字段,来实现跨域请求,同时对于不同的主机而言请求头是不一样的。你必须有一些明确的声明的配置文件,如果相应的CORS的配置文件没有找到的话,预检请求将会被拒绝,同时请求头也不会加到相应的响应当中。每一个HandlerMapping能够被独立的配置带着基于CorsConfiguration映射的url模式。通常情况下应用使用MVC Java的配置文件或者XML命名空间来声明这样的映射。通常情况下能够使每一个单一的map映射通过所有的HandlerMapping实例。

    @CrossOrigin:

    这个注解能够使跨域请求实现在注解控制器里面:主要的实现方法如下:

    @RestController
    @RequestMapping("/account")
    public class AccountController {
        @CrossOrigin
        @GetMapping("/{id}")
        public Account retrieve(@PathVariable Long id) {
            // ...
        }
        @DeleteMapping("/{id}")
        public void remove(@PathVariable Long id) {
            // ...
        }
    }
     

    默认情况下上述注解还实现了以下功能:

    1 :所有的origin请求字段。

    2:所有的请求头。

    3: 所有的被映射的HTTP方法。

    同时@Crossorigin继承所有的类和方法,相关的示例如下:

    @CrossOrigin(origins = "https://domain2.com", maxAge = 3600)
    @RestController
    @RequestMapping("/account")
    public class AccountController {

        @GetMapping("/{id}")
        public Account retrieve(@PathVariable Long id) {
            // ...
        }

        @DeleteMapping("/{id}")
        public void remove(@PathVariable Long id) {
            // ...
        }
    }

    全局配置:

     

    默认情况下,全局配置需要能够满足以下几点:

     

    1 :所有的:Ogrigin字段

     

    2:所有的请求头。

     

    3 :GET HEAD 和POST 方法。

     

    为了能够使CORS(跨域请求)在MVC 的Java 的配置文件里面配置,你需要使用CorsRegistry回调接口,具体的实现例子如下:

    @Configuration
    @EnableWebMvc
    public class WebConfig implements WebMvcConfigurer {

        @Override
        public void addCorsMappings(CorsRegistry registry) {

            registry.addMapping("/api/**")
                .allowedOrigins("https://domain2.com")
                .allowedMethods("PUT", "DELETE")
                .allowedHeaders("header1", "header2", "header3")
                .exposedHeaders("header1", "header2")
                .allowCredentials(true).maxAge(3600);

            // Add more mappings...
        }
    }

    XML配置:

    为了能够使CORS(跨域请求)实现在XML的命名空间需要使用<mvc:cors>组件元素,具体的实现例子如下:

    <mvc:cors>

        <mvc:mapping path="/api/**"
            allowed-origins="https://domain1.com, https://domain2.com"
            allowed-methods="GET, PUT"
            allowed-headers="header1, header2, header3"
            exposed-headers="header1, header2" allow-credentials="true"
            max-age="123" />

        <mvc:mapping path="/resources/**"
            allowed-origins="https://domain1.com" />

    </mvc:cors>

    CORS Fliter:

    你可以使跨域请求内置在CorsFliter类当中(即跨域过滤器)。实现配置这个过滤器,CorsConfigurationSource及其构造函数。相关的示例如下:

    CorsConfiguration config = new CorsConfiguration();

    // Possibly...
    // config.applyPermitDefaultValues()

    config.setAllowCredentials(true);
    config.addAllowedOrigin("https://domain1.com");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", config);

    CorsFilter filter = new CorsFilter(source);

    默认情况下上述注解还实现了以下功能:

    1 :所有的origin请求字段。

    2:所有的请求头。

    3: 所有的被映射的HTTP方法。

    同时@Crossorigin继承所有的类和方法,相关的示例如下:

    复制代码
    复制代码
    
    
    复制代码
    复制代码

    全局配置:

    默认情况下,全局配置需要能够满足以下几点:

    1 :所有的:Ogrigin字段

    2:所有的请求头。

    3 :GET HEAD 和POST 方法。

    为了能够使CORS(跨域请求)在MVC 的Java 的配置文件里面配置,你需要使用CorsRegistry回调接口,具体的实现例子如下:

    复制代码
    复制代码
    
    
    复制代码
    复制代码

    XML配置:

    为了能够使CORS(跨域请求)实现在XML的命名空间需要使用<mvc:cors>组件元素,具体的实现例子如下:

    复制代码
    复制代码
    
    
    复制代码
    复制代码

    CORS Fliter:

    你可以使跨域请求内置在CorsFliter类当中(即跨域过滤器)。实现配置这个过滤器,CorsConfigurationSource及其构造函数。相关的示例如下:

    复制代码
    复制代码
    
    
  • 相关阅读:
    2018.8.20 Python之路---常用模块
    2018.8.16 正则表达式
    2018.8.15 python中的冒泡法排序
    2018.8.15 python 中的sorted()、filter()、map()函数
    2018.8.14 python中的内置函数(68个)
    2018.8.13 python中生成器和生成器表达式
    2018.8.10 python中的迭代器
    2018.8.9 python中的动态传参与命名空间
    python测试开发django(1)--开始Hello World!
    UPC-5120 Open-Pit Mining(最大权闭合子图)
  • 原文地址:https://www.cnblogs.com/Murcie/p/10830345.html
Copyright © 2011-2022 走看看