Spring (63)CORS,如何在Spring中配置它

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)等配置信息。
  • CorsConfigurationSourceUrlBasedCorsConfigurationSource: 这些接口和类提供了一种机制,用于根据请求的URL路径来查找相应的CorsConfiguration
  • CorsProcessor: 它是处理实际CORS请求的组件,使用相关的CorsConfiguration来验证请求并设置必要的CORS响应头。

当一个跨域请求到达Spring应用时,Spring的DispatcherServlet会委托CorsProcessor来处理这个请求。CorsProcessor会根据请求的URL和配置的CorsConfigurationSource来确定适用的CORS配置,并据此设置响应头。

这个处理流程确保了Spring应用能够灵活地支持CORS,无论是全局配置还是局部配置。通过深入了解和适当地配置这些组件,开发人员可以精确地控制哪些外部源可以访问应用中的不同部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辞暮尔尔-烟火年年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值