SpringCloud Gateway 自定义 过滤器:
局部过滤器
过滤器要求:
在过滤器(MyParamGatewayFilterFactory)中将http://localhost:10010/api/user/8?name=xxx中的参数name的值获取到并输出到控制台;并且参数名是可变的,也就是不一定每次都是name;需要可以通过配置过滤器的时候做到配置参数名。
1,自定义过滤器命名规则 :XXXXGatewayFilterFactory
2,创建一个静态内部类Config ,里面的属性为配置文件中配置的参数
- 过滤器名称=参数1,参数2…
3,extends AbstractGatewayFilterFactory<创建的静态内部类>
4,重写**shortcutFieldOrder()**方法
返回List参数列表为Config中属性集合
return Arrays.asList(“参数1”,参数2…);
5,无参构造方法中
super(Config.class);
6.编写过滤逻辑 public GatewayFilter apply(Config config)
@Override public GatewayFilter apply(Config config) { return ((exchange, chain) -> { //前置过滤器代码逻辑 return chain.filter(exchange);//执行请求 //后置过滤器代码逻辑 }); }
注意:不要重写其他方法 ,会导致异常Unable to find GatewayFilterFactory with name xxx
7.application.yml配置过滤器
filters: - MyParam=name
下图为 shortcutFieldOrder()方法返回的集合为Config的属性名称集合
完整代码:
@Component
public class MyParamGatewayFilterFactory extends AbstractGatewayFilterFactory<MyParamGatewayFilterFactory.Config> {
public MyParamGatewayFilterFactory() {
super(MyParamGatewayFilterFactory.Config.class);
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("param");
}
@Override
public GatewayFilter apply(Config config) {
return ((exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
if (request.getQueryParams().containsKey(config.param)) {
System.out.println("局部过滤器获取到的参数:" + config.param + "=" + request.getQueryParams().get(config.param).get(0));
}
return chain.filter(exchange);
});
}
public static class Config {
//对应在配置文件中配置过滤器的时候指定的参数名列表
private String param;
public String getParam() {
return param;
}
public void setParam(String param) {
this.param = param;
}
}
}
全局过滤器
过滤器要求:
编写全局过滤器,在过滤器中检查请求中是否携带token请求头。如果token请求头存在则放行;如果token为空或者不存在则设置返回的状态码为:未授权也不再执行下去.
1,编写一个类 ,实现 两个接口: GlobalFilter, Ordered
GlobalFilter:全局过滤拦截器
Ordered:拦截器的顺序,数字越低,优先级越高
-----------------全局过滤器不用配置 --------------
@Component
public class MyGlobalFilter implements GlobalFilter,Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
boolean token = exchange.getRequest().getHeaders().containsKey("token");
System.out.println("----全局过滤器token----"+token);
if (!token){
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
ServerHttpResponse response = exchange.getResponse();
return response.setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 1;
}
}