• CORS


    一、CORS在Spring mvc中跨域的使用有3种方式

    1.通过内置的CorsFilter应用CORS支持

    要配置过滤器,要将CorsConfigurationSource传递给它的构造函数。:

    CorsConfiguration config = new CorsConfiguration();  //声明一个CorsConfiguration对象并实例化,CorsConfiguration是一个具体封装跨域配置信息的pojo
    config.setAllowCredentials(true);
    config.addAllowedOrigin("https://domain1.com");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); //UrlBasedCorsConfigurationSource是存储request与跨域配置信息的容器
    source.registerCorsConfiguration("/**", config);
    CorsFilter filter = new CorsFilter(source);  //CorsFilter是实现OncePerRequestFilter接口的Adapter

    2.全局配置

    ①Java Configuration

    要在MVC Java配置中启用CORS,可以使用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 Configuration

    要在XML名称空间中启用CORS,可以使用<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>

    3.使用注解@CrossOrigin

    @RestController
    @RequestMapping("/account")
    public class AccountController {

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

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

    二、处理

    CORS规范区分了预检,简单和实际请求。要了解CORS的工作原理

    Spring MVC HandlerMapping实现为CORS提供内置支持。在成功将请求映射到处理程序之后,HandlerMapping实现会检查给定请求和处理程序的CORS配置并采取进一步操作。直接处理预检请求,同时拦截,验证简单和实际的CORS请求,并设置所需的CORS响应头。

    为了启用跨源请求(即,Origin标头存在且与请求的主机不同),您需要具有一些显式声明的CORS配置。如果未找到匹配的CORS配置,则拒绝预检请求。没有CORS头添加到简单和实际CORS请求的响应中,因此浏览器拒绝它们。

    每个HandlerMapping都可以 使用基于URL模式的映射单独配置CorsConfiguration在大多数情况下,应用程序使用MVC Java配置或XML命名空间来声明此类映射,这会导致将单个全局映射传递给所有HandlerMappping实例。

    您可以将该HandlerMapping级别的全局CORS配置与更细粒度的处理程序级CORS配置相结合。例如,带注释的控制器可以使用类或方法级@CrossOrigin注释(其他处理程序可以实现 CorsConfigurationSource)。

    组合全局和本地配置的规则通常是附加的 - 例如,所有全局和所有本地源。对于只能接受单个值的属性(例如allowCredentialsmaxAge),本地会覆盖全局值。

  • 相关阅读:
    进程池-非阻塞式
    进程
    单例模式
    Python内置函数之open()
    Python内置函数之len()
    Python内置函数之isinstance()
    Python内置函数之input()
    可迭代对象,迭代器(生成器)区别
    Tomcat控制台输出
    Python内置函数之format()
  • 原文地址:https://www.cnblogs.com/wudidd/p/10666051.html
Copyright © 2020-2023  润新知