SpringCloud Gateway过滤器工厂配置及自定义过滤器工厂

SpringCloud Gateway 内置的过滤工厂:

官方文档:

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
修改原始响应体的内容
修改后的响应体内容

 

 自定义过滤器:

自定义过滤器:继承AbstractNameValueGatewayFilterFactory且我们的自定义名称必须要以GatewayFilterFactory结尾并交给spring管理

过滤器代码:

package com.geteway.vn.filter;

import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Arrays;
import java.util.List;

/**
 * @author vn
 * @version 1.0
 * @date 2022/3/14 21:54
 */
@Component
public class CheckAuthGatewayFilterFactory
        extends AbstractGatewayFilterFactory<CheckAuthGatewayFilterFactory.Config> {


    public CheckAuthGatewayFilterFactory() {
        super(Config.class);
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("value");
    }

    @Override
    public GatewayFilter apply(Config config) {
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                String name=exchange.getRequest().getQueryParams().getFirst("name");

                if(StringUtils.isNotBlank(name)){
                    if(config.getValue().equals(name)){
                        return chain.filter(exchange);
                    }
                    else {
                        // 返回404
                        exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
                        return exchange.getResponse().setComplete();
                    }
                }
                // 正常请求
                return chain.filter(exchange);
            }
        };
    }


    public static class Config {
        private String value;

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }

}

配置文件:

server:
  port: 8088
spring:
  application:
    name: api-gateway
  cloud:
    gateway:   # gateway的配置
      routes:  #路由规则
        - id: order_route  # 路由的唯一标识,路由到order
          uri: lb://order-service  #需要转发的地址   lb: 使用nacos中的本地负载均衡策略  order-service服务名
          predicates:  #断言规则 用于路由规则的匹配
            - Path=/order-serv/**    # http://localhost:8088/order-serv/vn/order 路由转到  http://localhost:80/order-serv/vn/order
          filters:
            - StripPrefix=1 # 转发之前去掉1层路径  变成 -> http://localhost:80/vn/order
            - AddRequestHeader=X-Request-color, red    #添加请求头
            - PrefixPath=/order-ser  # 添加前缀 对应微服务需要配置context-path
            - CheckAuth=vn    # 为自定义过滤器
        #    - RedirectTo=302, https://www.baidu.com/
    nacos:
      server-addr: 192.168.43.197:8848
      discovery:
        username: nacos
        password: nacos

 

posted @ 2022-03-10 23:20  VNone  阅读(842)  评论(0)    收藏  举报