SpringCloud学习–基础–6.3.2–Gateway–过滤器–案例
1、配置全局默认过滤器
1.1、代码
1.2、测试
2、自定义局部过滤器
2.1、代码
package feizhou.app_gateway.business;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
public class MyParamGatewayFilterFactory extends AbstractGatewayFilterFactory<MyParamGatewayFilterFactory.Config> {
static final String PARAM_NAME = "param";
public MyParamGatewayFilterFactory() {
super(Config.class);
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList(PARAM_NAME);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
// http://localhost:10010/user/8?name=userId config.param ==> name
// 获取请求参数中param对应的参数名 的参数值
ServerHttpRequest request = exchange.getRequest();
if (request.getQueryParams().containsKey(config.param)) {
request.getQueryParams().get(config.param).forEach(
value -> System.out.println("------------局部过滤器-------参数名字:" + config.param + "--参数值:" + value));
}
return chain.filter(exchange);
};
}
public static class Config {
// 对应在配置过滤器的时候指定的参数名
private String param;
public String getParam() {
return param;
}
public void setParam(String param) {
this.param = param;
}
}
}
spring:
cloud:
gateway:
routes:
# 路由id,可以任意,要保证唯一
- id: route-app_ribbon
# uri: http://127.0.0.1:8883
# lb表从注册中心中按照名称获取微服务,并遵循负载均衡策略
uri: lb://app-ribbon
# 路由断言: 可以匹配映射路径
predicates:
- Path=/app_ribbon_route/**
# 去除前缀/app_ribbon_route
# 1表示过滤1个路径,2表示两个路径,以此类推
filters:
- StripPrefix=1
# 局部过滤器
- MyParam=name
2.2、测试
3、自定义全局过滤器
定义一个全局过滤器检查请求中是否携带有token参数
- 是:通过
- 否:不通过,告诉客户端401提示
3.1、代码
package feizhou.app_gateway.business;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("--------------全局过滤器MyGlobal11Filter------------------");
String token = exchange.getRequest().getQueryParams().getFirst("token");
if (StringUtils.isBlank(token)) {
// 设置响应状态码为未授权
// UNAUTHORIZED(401, "Unauthorized"),
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
// 值越小越先执行
return 1;
}
}