环境 SpringCloud:Finchley.RELEASE SpringBoot:2.0.0.RELEASE JDK:1.8
1. 过滤器
SpringCloud gateway 除了具备路由的功能,也支持对请求的过滤,类似Zuul网关,也是通过过滤器实现的。
1.1 过滤器基础
1.1.1 过滤器生命周期
- Pre Pre过滤器在请求被路由之前调用。可以通过pre过滤器实现身份认证
- Post post过滤器是在路由到微服务后执行,可以用来给响应添加http header、收集统计信息和指标、将微服务响应返回给客户端
1.1.2 过滤器类型
- Gateway Filter 应用到单一或一组路由上
- 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 自定义过滤器
- 创建自定义过滤器
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 权限认证
- 修改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;
}
}
- 测试,请求
http://localhost:6101/product/provider/list?access-token=100
返回成功; 请求http://localhost:6101/product/provider/list
返回未登录