Gateway网关中配置跨域的三种方案

本文介绍了解决前后端分离项目的跨域问题的三种方法:通过在Controller类上添加注解、配置类统一处理以及在application.properties/yml文件中配置。

方法一:直接在每个Controller类上添加跨域注解

@CrossOrigin

方法二:通过配置类统一处理

@Configuration
public class CorsConfig {

    
    // 该配置适用于reactive响应式环境
    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        // springboot升级成2.4.0以上时对AllowedOrigin设置发生了改变,不能有”*“,可以替换成AllowedOriginPattern
        config.addAllowedOriginPattern("*");
        config.setAllowCredentials(true);

        // 必须是reactive包下的UrlBasedCorsConfigurationSource 
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);

        return new CorsWebFilter(source);


    // 该配置适用于servlet环境
    @Bean
    public CorsFilter corsFilter() {
        //1. 添加 CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些请求方式
        config.addAllowedMethod("*");
        //放行哪些原始请求头部信息
        config.addAllowedHeader("*");
        //放行哪些原始域
        config.addAllowedOriginPattern("*");
        //是否发送 Cookie
        config.setAllowCredentials(true);
        //2. 添加映射路径
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**",config);
        //3. 返回新的CorsFilter
        return new CorsFilter(corsConfigurationSource);
    }

 重写WebMvcConfigurer接口的默认方法

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedMethods("*")
                .allowedHeaders("*")
                .allowedOriginPatterns("*")
                .allowCredentials(true);
    }
}

方法三:在配置application.properties或者application.yml文件中进行统一配置

spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedMethods: "*"
            allowedHeaders: "*"
            allowedOriginPatterns: "*"
            allowCredentials: true

Spring Cloud Gateway配置请求(CORS)支持,可以通过定义全局的 `CorsWebFilter` 来实现。该过滤器能够拦截所有请求,并在响应头中添加 CORS 相关的字段,例如 `Access-Control-Allow-Origin`、`Access-Control-Allow-Methods` 等。 以下是一个典型的配置示例,展示了如何在 Spring Cloud Gateway 中启用和配置 CORS: ### 配置全局 CORS 过滤器 在你的 Spring Boot 应用中,创建一个配置类,添加 `CorsWebFilter` 的 Bean 定义: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.reactive.CorsWebFilter; import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; import java.util.Arrays; @Configuration public class CorsConfig { @Bean public CorsWebFilter corsWebFilter() { CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); // 允许携带凭证(如 cookies) config.addAllowedOrigin("https://example.com"); // 设置允许的源 config.addAllowedHeader("*"); // 允许所有请求头 config.addAllowedMethod("*"); // 允许所有 HTTP 方法 config.addExposedHeader("X-Custom-Header"); // 暴露自定义响应头(可选) UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); // 对所有路径生效 return new CorsWebFilter(source); } } ``` ### 通过 application.yml 配置(可选) 如果你更倾向于使用 `application.yml` 来配置某些关行为,可以结合 `spring.cloud.gateway.globalcors` 属性来设置 CORS。以下是基于 YAML 的配置方式: ```yaml spring: cloud: gateway: globalcors: cors-configurations: '[/**]': allowedOrigins: "https://example.com", "https://anotherdomain.com" allowedMethods: GET, POST, PUT, DELETE, OPTIONS allowedHeaders: "*" allowCredentials: true exposedHeaders: "X-Custom-Header" maxAge: 3600 ``` ### 配置说明 - **allowedOrigins**: 指定允许请求的来源。可以使用通配符 `"*"` 表示允许所有来源。 - **allowedMethods**: 允许的 HTTP 方法,如 `GET`, `POST`, `PUT`, `DELETE` 等。 - **allowedHeaders**: 允许的请求头字段,`"*"` 表示允许所有请求头。 - **allowCredentials**: 是否允许发送 Cookie 或认证信息。 - **exposedHeaders**: 响应头中暴露给客户端的自定义头字段。 - **maxAge**: 预检请求(preflight)的结果缓存时间,单位为秒。 ### 注意事项 - 配置中使用 `/**` 表示对所有路径生效。 - 如果你使用了 `application.yml` 的配置方式,则无需手动编写 Java 配置类。 - 在生产环境中,建议明确指定允许的来源(`allowedOrigins`),而不是使用 `"*"`,以提高安全性。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

龙茶清欢

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

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

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

打赏作者

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

抵扣说明:

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

余额充值