CORS简介
CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种机制,它使用额外的HTTP头来告诉浏览器让运行在一个origin(源)上的Web应用被准许访问来自不同源服务器上的指定资源。当一个资源从与该资源本身不同的域、协议或端口请求一个资源时,资源会发起一个跨域HTTP请求。
CORS机制主要是为了安全考虑,防止恶意网站读取另一个网站上的敏感数据。不过,网站可以声明愿意让其资源通过CORS被其他网站访问。
在Spring中配置CORS
在Spring框架中,特别是在使用Spring MVC或Spring WebFlux时,有多种方式可以配置CORS。我们将通过全局配置和局部配置两种方式来深入探讨。
全局CORS配置
全局CORS配置影响整个Spring应用的所有控制器。这种方式通常在WebMvcConfigurer
(对于Spring MVC)或WebFluxConfigurer
(对于Spring WebFlux)的实现中完成。
Spring MVC示例
在Spring MVC中,你可以通过实现WebMvcConfigurer
接口,并重写addCorsMappings
方法来实现全局CORS配置。
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("/api/**")
.allowedOrigins("https://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("Header1", "Header2", "Header3")
.exposedHeaders("Header1", "Header2")
.allowCredentials(true)
.maxAge(3600);
}
}
这个配置允许来自https://example.com
的跨域请求访问/api/**
路径下的资源,并且配置了其他CORS相关的设置。
Spring WebFlux示例
在Spring WebFlux中,配置方式类似,但需要实现WebFluxConfigurer
接口。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.config.CorsRegistry;
import org.springframework.web.reactive.config.WebFluxConfigurer;
@Configuration
public class WebFluxConfig implements WebFluxConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("https://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("Header1", "Header2", "Header3")
.exposedHeaders("Header1", "Header2")
.allowCredentials(true)
.maxAge(3600);
}
}
局部CORS配置
除了全局配置之外,Spring也允许对单独的控制器或者处理器方法应用CORS配置。这是通过在控制器类或方法上使用@CrossOrigin
注解来实现的。
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@CrossOrigin(origins = "https://example.com")
@GetMapping("/api/resource")
public String getResource() {
return "Some Resource";
}
}
在这个例子中,@CrossOrigin
注解使得https://example.com
可以跨域请求/api/resource
这个端点。这种方式提供了更细粒度的控制,适用于只有部分路由需要特定的CORS配置的情况。
深入源码
Spring内部处理CORS的机制相对复杂,主要涉及以下几个核心类:
CorsConfiguration
: 此类表示CORS配置,包含了如允许的源(origins)、HTTP方法(methods)、头部(headers)等配置信息。CorsConfigurationSource
和UrlBasedCorsConfigurationSource
: 这些接口和类提供了一种机制,用于根据请求的URL路径来查找相应的CorsConfiguration
。CorsProcessor
: 它是处理实际CORS请求的组件,使用相关的CorsConfiguration
来验证请求并设置必要的CORS响应头。
当一个跨域请求到达Spring应用时,Spring的DispatcherServlet会委托CorsProcessor
来处理这个请求。CorsProcessor
会根据请求的URL和配置的CorsConfigurationSource
来确定适用的CORS配置,并据此设置响应头。
这个处理流程确保了Spring应用能够灵活地支持CORS,无论是全局配置还是局部配置。通过深入了解和适当地配置这些组件,开发人员可以精确地控制哪些外部源可以访问应用中的不同部分。
标签:Spring,配置,springframework,CORS,63,org,import From: https://blog.csdn.net/qq_43012298/article/details/136966306