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),本地会覆盖全局值。

原文地址:https://www.cnblogs.com/wudidd/p/10666051.html