本文主要是介绍Spring Cloud全解析:网关之GateWay过滤器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
GateWay过滤器
路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,只能指定路由进行使用,由GatewayFilter的工厂类来产生,Gateway官方提供了很多的路由过滤器,也可以实现自己的自定义过滤器
内置过滤器
请求头/响应头过滤器
-
AddRequestHeaderGatewayFilterFactory
-
AddResponseHeaderGatewayFilterFactory
-
DedupeResponseHeaderGatewayFilterFactory 处理重复响应头
有三种策略 RETAIN_FIRST、RETAIN_LAST、RETAIN_UNIQUE
spring:cloud:gateway:default-filters:- DedupeResponseHeader=Access-Control-Allow-Credentials, RETAIN_LAST #规则写在最后
-
PreserveHostHeaderGatewayFilterFactory
-
RemoveRequestHeaderGatewayFilterFactory
-
RemoveResponseHeaderGatewayFilterFactory
-
RequestHeaderSizeGatewayFilterFactory
-
SecureHeadersGatewayFilterFactory
-
SetRequestHeaderGatewayFilterFactory
-
SetResponseHeaderGatewayFilterFactory
请求参数过滤器
-
AddRequestParameterGatewayFilterFactory
spring:cloud:gateway:default-filters:- AddRequestHeader=X-Request-red, blue
-
RemoveRequestParameterGatewayFilterFactory
路径过滤器
-
PrefixPathGatewayFilterFactory 为匹配的url添加指定前缀
spring:cloud:gateway:default-filters:- PrefixPath=/mypath # 增加指定前缀,如/hello变成/mypath/hello
-
RewritePathGatewayFilterFactory 采用正则表达式替换参数
spring:cloud:gateway:default-filters:- RewritePath=/red/?(?<segment>.*), /$\{segment} # 两个参数,一个是请求路径的正则表达式,一个是替换的路径参数,如/red/blue会变成/blue
-
SetPathGatewayFilterFactory
-
StripPrefixGatewayFilterFactory 在将请求发送到下游之前从请求中剥离的路径个数
spring:cloud:gateway:default-filters:- StripPrefix=2 # 如/mypath/red/blue会变成/blue
请求体/响应体过滤器
- RequestSizeGatewayFilterFactory
响应状态过滤器
-
SetStatusGatewayFilterFactory
spring:cloud:gateway:default-filters:- SetStatus=401
会话过滤器
- SaveSessionGatewayFilterFactory
重定向过滤器
- RedirectToGatewayFilterFactory
重试过滤器
- RetryGatewayFilterFactory
限流过滤器
- RequestRateLimiterGatewayFilterFactory
自定义
自定义全局过滤器
实现自定义的全局过滤器,需要实现GlobalFilter和Ordered接口,全局过滤器,不需要在配置文件中配置,作用在所有的路由上,最终通过 GatewayFilterAdapter 包装成 GatewayFilterChain 可识别的过滤器,为请求业务以及路由的 URI 转换为真实业务服务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("过滤器进入");String token = exchange.getRequest().getQueryParams().getFirst("token");if(StringUtils.isBlank(token)){System.out.println("不包含token");exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}// 继续执行过滤器链return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}
全局过滤器不需要在配置文件中配置
自定义网关过滤器
实现GatewayFilter方式
需要实现GatewayFilter和Ordered接口
@Component
public class MyCustomFilter implements GatewayFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("自定义过滤器进入");// 继续执行过滤器链return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}
需要使用java编码来配置自定义过滤器
@Configuration
public class MyConfig {/**配置自定义过滤器*/@Beanpublic RouteLocator routeLocator(RouteLocatorBuilder builder) {return builder.routes().route(r ->r.path("/provider/**")//用户访问的路径.uri("lb://service-provider")//路由的真实服务器ip+端口.filters(new MyCustomFilter()) // 局部过滤器.id("provider_route")) // 路由id.build();}
}
使用GatewayFilter还需要硬编码,不太好用,那么有没有更方便的方式呢?
继承AbstractGatewayFilterFactory
public class MyCustomGatewayFilterFactory extends AbstractGatewayFilterFactory<MyCustomGatewayFilterFactory.Config> {public MyCustomGatewayFilterFactory() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config, Class<Config> configClass) {// 在这里创建并返回过滤器实例return (exchange, chain) -> {// 过滤器逻辑return chain.filter(exchange);};}public static class Config {// 过滤器的配置参数}
}
配置
spring:cloud:gateway:routes:- id: myuri: http://example.comfilters:- MyCustom=1predicates:- Path=/api/**
https://zhhll.icu/2021/框架/微服务/springcloud/网关/GateWay/3.GateWay过滤器/
这篇关于Spring Cloud全解析:网关之GateWay过滤器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!