转载

SpringCloud | gateway(2)-过滤器

SpringCloud gateway 除了具备路由的功能,也支持对请求的过滤,类似Zuul网关,也是通过过滤器实现的。

1.1 过滤器基础

1.1.1 过滤器生命周期

  1. Pre Pre过滤器在请求被路由之前调用。可以通过pre过滤器实现身份认证
  2. Post post过滤器是在路由到微服务后执行,可以用来给响应添加http header、收集统计信息和指标、将微服务响应返回给客户端

1.1.2 过滤器类型

  1. Gateway Filter 应用到单一或一组路由上
  2. Global Filter 应用到所有路由上

1.2 局部过滤器

序号 局部过滤器名称
1 AddRequestHeader GatewayFilter
2 AddRequestParameter GatewayFilter
3 AddResponseHeader GatewayFilter
4 DedupeResponseHeader
5 Hystrix
6 Spring Cloud CircuitBreaker GatewayFilter
7 FallbackHeaders GatewayFilter Factory
8 MapRequestHeader GatewayFilter
9 PrefixPath GatewayFilter
10 PreserveHostHeader GatewayFilter
11 RequestRateLimiter GatewayFilter
12 RedirectTo GatewayFilter
13 RemoveRequestHeader GatewayFilter
14 RemoveResponseHeader GatewayFilter
15 RemoveRequestParameter GatewayFilter
16 RewritePath GatewayFilter
17 RewriteLocationResponseHeader GatewayFilter
18 RewriteResponseHeader GatewayFilter
19 SaveSession GatewayFilter
20 SecureHeaders GatewayFilter
21 SetPath GatewayFilter
22 SetRequestHeader GatewayFilter
23 SetResponseHeader GatewayFilter
24 SetStatus GatewayFilter
25 StripPrefix GatewayFilter
26 Retry GatewayFilter
27 RequestSize GatewayFilter
28 Modify a Request Body GatewayFilter
29 Modify a Response Body GatewayFilter
30 Default Filters

1.3 全局过滤器

序号 全局过滤器名称
1 Forward Routing Filter
2 The LoadBalancerClient Filter
3 The ReactiveLoadBalancerClientFilter
4 The Netty Routing Filter
5 The Netty Write Response Filter
6 The RouteToRequestUrl Filter
7 The Websocket Routing Filter
8 The Websocket Routing Filter
9 The Gateway Metrics Filter

1.4 自定义过滤器

  1. 创建自定义过滤器 com.xyz.gateway.filters.MyFilter
@Component
@Log4j2
public class MyFilter  implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("自定义全局过滤器-MyFilter");
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}
复制代码

1.5 权限认证

  1. 修改MyFilter,判断请求参数中是否包含access-token,若包含继续处理,若不包含则返回
@Component
@Log4j2
public class MyFilter  implements GlobalFilter, Ordered {

    /**
     * 认证鉴权:判断请求参数中是否包含access-token,若包含继续处理,若不包含直接返回
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("自定义全局过滤器-MyFilter");

        String token = exchange.getRequest().getQueryParams().getFirst("access-token");
        if ( token == null) {
            log.info("没有登录");
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }

        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}
复制代码
  1. 测试,请求 http://localhost:6101/product/provider/list?access-token=100 返回成功; 请求 http://localhost:6101/product/provider/list 返回未登录
原文  https://juejin.im/post/5e9fe442f265da47c4323051
正文到此结束
Loading...