* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████ ┃+
* ┃ ┃ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃
* ┃ ┃ + + + +
* ┃ ┃
* ┃ ┃ + 神兽保佑
* ┃ ┃ 代码无bug
* ┃ ┃ +
* ┃ ┗━━━┓ + +
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
第一种方式:
- 继承并实现了
WebMvcConfigurer
接口,并重写了addCorsMappings
方法。 - 这种方式利用了Spring MVC的内置 CORS 支持,通过向
CorsRegistry
添加映射来配置CORS策略。
// package com.hqa.system.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 跨域过虑器
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
// 跨域
@Override
public void addCorsMappings(CorsRegistry registry) {
// 允许任何来源的跨域请求
registry.addMapping("/**")
.allowedOrigins("*") // 允许任何源
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的方法
.allowCredentials(true) // 允许携带cookie
.maxAge(3600) // 预检请求的有效期
.allowedHeaders("*"); // 允许所有头信息
}
}
======================================================================================================
第二种方式:
- 直接定义了一个
CorsFilter
类型的@Bean
。 - 这种方式是通过自定义 Filter 实现 CORS 跨域策略,配置了一个
CorsConfiguration
对象,并将其绑定到UrlBasedCorsConfigurationSource
,最后返回一个新的CorsFilter
实例。
// package com.hqa.system.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class GlobalCorsConfig {
@Bean
public CorsFilter corsFilter(){
CorsConfiguration config = new CorsConfiguration();
//允许白名单域名进行跨域调用
config.addAllowedOrigin("*");
//允许跨越发送cookie
config.setAllowCredentials(true);
//放行全部原始头信息
config.addAllowedHeader("*");
//允许所有请求方法跨域调用
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
-
实现层面:
- 第一种方式更简洁直观,充分利用了Spring Boot对Web MVC的集成支持,无需手动创建和配置过滤器。
- 第二种方式更加灵活,可以对Filter进行更多定制,例如实现更复杂的跨域策略,不仅限于Spring MVC框架。
-
性能影响:
WebMvcConfigurer
方式更适合大部分常规场景,因为它的实现是由Spring MVC框架自身处理的,理论上性能上可能稍优。- 自定义
CorsFilter
方式每次HTTP请求都会经过过滤器,虽然一般情况下性能损耗不大,但在高并发环境下,如果过滤器逻辑复杂可能会影响性能。