# 简介
网关过滤器工厂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:全局过滤器
增加请求头
- 继承 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);
};
}
}
- 配置
spring:
cloud:
gateway:
routes:
- id: jd_router
uri: http://localhost:8081/depart/hea
predicates:
- Path=/**
filters:
- AddHeader=name,zhangsan