# 简介

网关过滤器工厂GatewayFilterFactory允许以某种方式修改传入的HTTP请求或返回的HTTP响应。

其作用域是某些特定路由。Spring Cloud Gateway包括很多种内置的网关过滤器工厂。

# AddRequestHeader 增加请求头

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        filters:
        - AddRequestHeader=X-Request-red, blue

# AddRequestHeadersIfNotPresent 请求头不存在的情况下增加

注意:AddRequestHeadersIfNotPresent可以增加多个请求头,赋值是: 不是,

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        filters:
          - AddRequestHeadersIfNotPresent=X-Request-Color-1:blue,X-Request-Color-2:green

# AddRequestParameter 增加请求参数

spring:
  cloud:
    gateway:
      routes:
        - id: add_request_parameter_route
          uri: https://example.org
          filters:
            - AddRequestParameter=red, blue

# AddResponseHeader 增加响应头

spring:
  cloud:
    gateway:
      routes:
        - id: add_response_header_route
          uri: https://example.org
          filters:
            - AddResponseHeader=X-Response-Red, Blue

# PrefixPath 在请求路径前增加路径

spring:
  cloud:
    gateway:
      routes:
      - id: prefixpath_route
        uri: https://example.org
        filters:
        - PrefixPath=/mypath

# StripPrefix 去除路径前缀

spring:
  cloud:
    gateway:
      routes:
        - id: nameRoot
          uri: https://nameservice
          predicates:
            - Path=/name/order/list
            
            # 也可以使用*,用*的话就是前面任意都匹配,后面按照实际的匹配
#            - Path=/*/*/list
            # 最终的路径就是/name/list
          filters:
            - StripPrefix=1

# RewritePath 路径重写

spring:
  cloud:
    gateway:
      routes:
        - id: rewritepath_route
          uri: https://example.org
          predicates:
            - Path=/red/**
          filters:
            
            # 最终的路径就是 去除red 剩下的保留
            - RewritePath=/red/?(?<segment>.*), /$\{segment}

# 自定义过滤器

  • GatewayFilter:路由过滤器
  • GlobalFilter:全局过滤器

增加请求头

  1. 继承 AbstractNameValueGatewayFilterFactory 注意命名
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

@Component
public class AddHeaderGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
    private static final Logger log = LoggerFactory.getLogger(AddHeaderGatewayFilterFactory.class);

    /**
     * 这里以记录请求日志为例
     */
    @Override
    public GatewayFilter apply(NameValueConfig config) {
        return (exchange, chain) -> {

            //增加请求头,获取已经修改过的请求头
            ServerHttpRequest request = exchange.getRequest()
                    .mutate()
                    .header(config.getName(), config.getValue())
                    .build();

            ServerWebExchange chainExchange = exchange.mutate().request(request).build();


            log.info("request.getPath():{}", request.getPath());
            log.info("uri:{}", request.getURI());
            return chain.filter(chainExchange);
        };
    }

}
  1. 配置
spring:
  cloud:
    gateway:
      routes:
        - id: jd_router
          uri: http://localhost:8081/depart/hea
          predicates:
            - Path=/**
          filters:
            - AddHeader=name,zhangsan