一、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
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
)。
组合全局和本地配置的规则通常是附加的 - 例如,所有全局和所有本地源。对于只能接受单个值的属性(例如allowCredentials
和maxAge
),本地会覆盖全局值。