网关层配置跨域

通常来说我们都是会写一个配置类来说明,例如下面这样的:

/**
 * 全局跨域配置
 * 注意:前端从网关进行调用时需要配置
 */
@Configuration
public class GlobalCorsConfig {

    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.addAllowedOriginPattern("*");
        config.addAllowedHeader("*");
        config.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);

        return new CorsWebFilter(source);
    }

}

当然如果你引用的是Sa-Token这类框架,还需要在其配置类中,对预检请求做处理:

 @Configuration
public class SaTokenConfig {

 @Bean
    public SaReactorFilter getSaReactorFilter(IgnoreUrlsConfig ignoreUrlsConfig) {
        return new SaReactorFilter()
                // 拦截地址
                .addInclude("/**")
                // 配置白名单路径
                .setExcludeList(ignoreUrlsConfig.getUrls())
                // 鉴权方法:每次访问进入
                .setAuth(obj -> {
                    // 对于OPTIONS预检请求直接放行
                    SaRouter.match(SaHttpMethod.OPTIONS).stop();
                    ....
                    }

基本上这样就ok了。

当然也可以在配置文件中来对SpringCloud进行指定,这样就省略在写配置类的过程(当然还是建议第一种写法,灵活性更高):

  cloud:
    gateway:
      globalcors:
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
          # options请求 就是一种询问服务器是否浏览器可以跨域的请求
          # 如果每次跨域都有询问服务器是否浏览器可以跨域对性能也是损耗
          # 可以配置本次跨域检测的有效期maxAge
        # 在maxAge设置的时间范围内,不去询问,统统允许跨域
        cors-configurations:
          '[/**]':
            allowedOriginPatterns: "*"
            allowedHeaders: "*"
            allowedMethods: # 允许跨域的 Ajax请求
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            # allowCredentials: true
            maxAge: 3600
    
	 discovery:
        locator:
          enabled: true
          lower-case-service-id: true

discovery.locator.enabled 设置为 true 时,Spring Cloud Gateway 会启用服务发现功能,自动根据注册到服务发现(如 Eureka、Consul 等)中的服务来生成路由规则。也就是说当你有多个微服务在注册中心中时,Spring Cloud Gateway 可以动态地识别并路由到对应的服务,而无需手动配置每个服务的路由

下面我们重点解决关于跨域的部分:

这里主要是通过配置globalcors来实现的,具体实现了:

  • 允许任何来源的请求 (allowedOriginPatterns: "*").
  • 允许所有 HTTP 方法(如 GET, POST, PUT 等)。
  • 配置了最大预检请求缓存时间 maxAge 为 3600 秒,减少了跨域请求时的性能损耗。

maxAge: 3600:设置预检请求的有效期为 3600 秒(即 1 小时)。浏览器会缓存此信息,在 maxAge 时间内不再发送预检请求。

### 使用API网关实现请求解决方案 在分布式架构中,尤其是基于微服务的设计模式下,API 网关作为统一入口承担着重要的职责。当涉及到前端应用向后端服务发送 AJAX 请求时,可以通过 API 网关来有效解决问题。 #### 1. 问题概述 浏览器出于安全考虑,默认情况下不允许网页中的 JavaScript 向不同源的服务器发起 HTTP 请求[^2]。这种限制被称为同源策略 (Same-Origin Policy),即只有在同一协议、同一名和同一端口号的情况下才允许访问资源。如果违反这些条件,则会发生问题。 #### 2. API 网关的作用 API 网关是一种集中式的中间服务组件,所有客户端请求都先经过该网关再转发至相应的后端服务[^3]。由于 API 网关位于前端与后端之间,因此它可以屏蔽掉具体的后端地址细节,并通过配置 CORS(资源共享)头信息等方式支持请求。 #### 3. 配置 Access-Control-Allow-Credentials 为了使请求能够携带认证信息(如 Cookie 或 Token),需要设置 `Access-Control-Allow-Credentials` 响应头部为 true[^5]。这表明允许请求附带用户的凭证数据。需要注意的是,在启用此选项的同时还必须指定确切的允许来源列表而非通配符 (*) ,因为后者无法与 credentials 结合工作。 #### 4. 示例代码:Spring Cloud Gateway 解决方案 以下是利用 Spring Cloud Gateway 来处理的一个简单例子: ```java @Configuration public class CorsConfig { @Bean public CorsWebFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); // 允许Cookies config.addAllowedOrigin("http://example.com"); // 替换为目标网站的实际URL config.setMaxAge(3600L); config.addAllowedHeader("*"); config.addAllowedMethod("*"); source.registerCorsConfiguration("/**", config); return new CorsWebFilter(source); } } ``` 上述代码片段定义了一个全局性的过滤器,适用于所有的路径 (`/**`) 。其中设置了允许凭据传输以及指定了特定原点可以访问资源[^1]。 #### 5. 总结 借助于强大的功能特性,诸如 Spring Cloud Gateway 这样的工具可以帮助开发者轻松应对复杂的场景需求。不仅简化了开发流程,而且增强了系统的可维护性和扩展能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值