2.3 过滤器工厂( GatewayFilter Factories)配置
    Gateway 内置了很多的过滤器工厂,我们通过一些过滤器工厂可以进行一些业务逻辑处理器,比如添加剔除响应头,添加去除参数等
    image.png
    https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories

    过滤器工厂 作用 参数
    AddRequestHeader 为原始请求添加Header Header的名称及值
    AddRequestParameter 为原始请求添加请求参数 参数名称及值
    AddResponseHeader 为原始响应添加Header Header的名称及值

    DedupeResponseHeader

    剔除响应头中重复的值
    需要去重的Header名称及去重策略

    Hystrix
    为路由引入Hystrix的断路器保护 HystrixCommand 的名称

    FallbackHeaders
    为fallbackUri的请求头中添加具体的异常信息 Header的名称
    PrefixPath 为原始请求路径添加前缀 前缀路径

    PreserveHostHeader
    为请求添加一个preserveHostHeader=true 的 属 性,路由过滤器会检查该属性以决定是否要发送原始的Host


    RequestRateLimiter

    用于对请求限流,限流算法为令牌桶
    keyResolver、rateLimiter、statusCode、denyEmptyKey、emptyKeyStatus

    RedirectTo
    将原始请求重定向到指定的URL http状态码及重定向的url

    RemoveHopByHopHeadersFilter

    为原始请求删除IETF组织规定的一系列Header
    默认就会启用,可以通过配置指定仅删除哪些Header
    RemoveRequestHeader 为原始请求删除某个Header Header名称
    RemoveResponseHeader 为原始响应删除某个Header Header名称

    RewritePath

    重写原始的请求路径
    原始路径正则表达式以及重写后路径的正则表达式

    RewriteResponseHeader
    重写原始响应中的某个Header Header名称,值的正 则表达式,重写后的值

    SaveSession
    在转发请求之前,强制执行
    WebSession::save 操作


    secureHeaders
    为原始响应添加一系列起安全作用的响应头 无,支持修改这些安全响应头的值
    SetPath 修改原始的请求路径 修改后的路径

    SetResponseHeader
    修改原始响应中某个Header的值 Header名称,修改后的值

    SetStatus

    修改原始响应的状态码
    HTTP 状态码,可以是数字,也可以是字符串

    StripPrefix

    用于截断原始请求的路径
    使用数字表示要截断的路径的数量

    Retry

    针对不同的响应进行重试
    retries、statuses、methods、series

    RequestSize
    设置允许接收最大请求包的大 小。如果请求包大小超过设置的值,则返回 413 Payload Too
    Large

    请求包大小,单位为字节,默认值为5M

    ModifyRequestBody
    在转发请求之前修改原始请求体内容
    修改后的请求体内容
    ModifyResponseBody 修改原始响应体的内容 修改后的响应体内容

    2.3.1 添加请求头

    1. spring:
    2. cloud:
    3. gateway:
    4. #设置路由:路由id、路由到微服务的uri、断言
    5. routes:
    6. - id: order_route #路由ID,全局唯一
    7. uri: http://localhost:8020 #目标微服务的请求地址和端口
    8. #配置过滤器工厂
    9. filters:
    10. - AddRequestHeader=X-Request-color, red #添加请求头

    测试http://localhost:8888/order/testgateway

    1. @GetMapping("/testgateway")
    2. public String testGateway(HttpServletRequest request) throws Exception {
    3. log.info("gateWay获取请求头X-Request-color:"
    4. +request.getHeader("X-Request-color"));
    5. return "success";
    6. }
    7. @GetMapping("/testgateway2")
    8. public String testGateway(@RequestHeader("X-Request-color") String color) throws Exception {
    9. log.info("gateWay获取请求头X-Request-color:"+color);
    10. return "success";
    11. }

    image.png
    2.3.2 添加请求参数

    1. spring:
    2. cloud:
    3. gateway:
    4. #设置路由:路由id、路由到微服务的uri、断言
    5. routes:
    6. - id: order_route #路由ID,全局唯一
    7. uri: http://localhost:8020 #目标微服务的请求地址和端口
    8. #配置过滤器工厂
    9. filters:
    10. - AddRequestParameter=color, blue # 添加请求参数

    测试http://localhost:8888/order/testgateway3

    1. @GetMapping("/testgateway3")
    2. public String testGateway3(@RequestParam("color") String color) throws Exception {
    3. log.info("gateWay获取请求参数color:"+color);
    4. return "success";
    5. }

    image.png
    2.3.3 为匹配的路由统一添加前缀

    1. spring:
    2. cloud:
    3. gateway:
    4. #设置路由:路由id、路由到微服务的uri、断言
    5. routes:
    6. - id: order_route #路由ID,全局唯一
    7. uri: http://localhost:8020 #目标微服务的请求地址和端口
    8. #配置过滤器工厂
    9. filters:
    10. - PrefixPath=/mall-order # 添加前缀 对应微服务需要配置context-path

    mall-order中需要配置

    1. server:
    2. servlet:
    3. context-path: /mall-order

    测试:http://localhost:8888/order/findOrderByUserId/1 ====》http://localhost:8020/mall-order/order/findOrderByUserId/1
    2.3.4 重定向操作

    1. spring:
    2. cloud:
    3. gateway:
    4. #设置路由:路由id、路由到微服务的uri、断言
    5. routes:
    6. - id: order_route #路由ID,全局唯一
    7. uri: http://localhost:8020 #目标微服务的请求地址和端口
    8. #配置过滤器工厂
    9. filters:
    10. - RedirectTo=302, https://www.baidu.com/ #重定向到百度

    测试:http://localhost:8888/order/findOrderByUserId/1
    2.3.5 自定义过滤器工厂
    继承AbstractNameValueGatewayFilterFactory且我们的自定义名称必须要以GatewayFilterFactory结尾并交给spring管理。

    1. @Component
    2. @Slf4j
    3. public class CheckAuthGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
    4. @Override
    5. public GatewayFilter apply(NameValueConfig config) {
    6. return (exchange, chain) -> {
    7. log.info("调用CheckAuthGatewayFilterFactory==="
    8. + config.getName() + ":" + config.getValue());
    9. return chain.filter(exchange);
    10. };
    11. }
    12. }

    配置自定义的过滤器工厂

    1. spring:
    2. cloud:
    3. gateway:
    4. #设置路由:路由id、路由到微服务的uri、断言
    5. routes:
    6. - id: order_route #路由ID,全局唯一
    7. uri: http://localhost:8020 #目标微服务的请求地址和端口
    8. #配置过滤器工厂
    9. filters:
    10. - CheckAuth=fox,男

    测试
    image.png