废话

可以先看看某大佬对Gateway过滤器的理解:GateWay过滤器 - 天宇轩-王 - 博客园

网关就像是一个电影院的门口,所有观众进场都需要从这个门口进去,大点的影院可能有多个门口(集群),所以一些验票操作、识别操作、统计操作等都需要在门口这里完成,并且还要高效,不然所有人都拥挤在门口,或者是进门1小时观影1分钟,那就得出事故了。除了验票之外,还要给工作人员(资源文件)这类无需验票的人员放行。

所以权限校验这里,能用在内存层面完成的就在内存解决,内存解决不了的就换缓存,缓存还解决不了的才去数据库寻求支持,数据库都解决不了的,杀个程序员祭天吧。

概述

Gateway过滤器主要分两种,GatewayFilter局部过滤器、GlobalFilter全局过滤器。

这里主要实现2个逻辑:

(1)LogFilter,用于记录输入输出日志

(2)AuthFilter,用于校验请求是否合法、用户权限校验等(不怕麻烦的话,用户权限校验可以再封装一个过滤器)

GlobalFilter主要就是两个方法,filter和getOrder,filter就是过滤逻辑执行的地方了,order则表示过滤器的等级,数值越低等级越优先。所以我们将LogFilter的等级设置为-1为最高级别,记录所有的请求和响应信息,AuthFilter则设置10。

需要注意的是LogFilter这里,因为是需要等接口处理完成之后,才能把返回的日志拉出来记录,这个东西相比纯过滤器,耗费的资源应该要多很多,如果有其他更好的办法记录日志的话,就尽量不要在这里记录了。

代码

配置啥的就省略了,详情参考上一个文章。

具体逻辑跟注意事项我都写代码里了,直接看吧:

@Slf4j
@Component//这个不能漏啊,不然扫描不到这里就会导致过滤器不生效
public class LogFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpResponse originalResponse = exchange.getResponse();DataBufferFactory bufferFactory = originalResponse.bufferFactory();ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {@Overridepublic Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {if (body instanceof Flux) {//这里需要注意,如果是在本过滤器或者是其他过滤器中,过滤规则不通过然后直接返回错误信息的话,是到不了这一步的,这点切记。//这个问题目前我没找到解决方案,所以建议其他过滤器那边,认证不通过的时候,另外也记录一份日志。Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body;return super.writeWith(fluxBody.buffer().map(dataBuffer -> {//从缓存中把返回的数据提取出来DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();DataBuffer join = dataBufferFactory.join(dataBuffer);byte[] content = new byte[join.readableByteCount()];join.read(content);//释放掉内存DataBufferUtils.release(join);String s = new String(content, StandardCharsets.UTF_8);//记录输入输出log.info("type:api;param:{};cookie:{};hear:{};url:{};value:{}",exchange.getRequest().getQueryParams().toString(), exchange.getRequest().getCookies().toString(),exchange.getRequest().getHeaders().toString(), exchange.getRequest().getURI().toString(),s);//返回的结果已经提取出来打日志了,所以需要将数据重新写入byte[] uppedContent = new String(s.getBytes(), StandardCharsets.UTF_8).getBytes();return bufferFactory.wrap(uppedContent);}));}return super.writeWith(body);}};//继续执行return chain.filter(exchange.mutate().response(decoratedResponse).build());}@Overridepublic int getOrder() {return -1;}
}
@Slf4j
@Component
public class AuthFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//权限验证逻辑,忽略,这里直接返回验证不通过if (true) {ServerHttpResponse response = exchange.getResponse();DataBuffer buffer = response.bufferFactory().wrap("非法登录".getBytes(StandardCharsets.UTF_8));response.setStatusCode(HttpStatus.UNAUTHORIZED);response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");return response.writeWith(Mono.just(buffer));}//认证通过,往下走return chain.filter(exchange);}@Overridepublic int getOrder() {return 10;}
}

Gateway 网关 (二) 全局过滤器相关推荐

  1. 服务网关(Gateway)自定义全局过滤器统一Token处理

    网关登录校验 在网关工程中添加全局过滤器 ​ import com.alibaba.fastjson.JSON; import com.xuecheng.commons.model.vo.AuthIn ...

  2. Gateway网关-路由的过滤器配置

    过滤器工厂 GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理: 路由过滤器的种类 Spring提供了31种不同的路由过滤器工厂.例如: 名称 说明 Ad ...

  3. gateway网关服务的高级配置

    源码:学习demo: 关于学习的所有代码 目录: gateway网关的断言工厂 gateway网关的过滤器工厂 gateway网关的全局过滤器,即可以自定义业务代码的过滤器 一.gateway网关的断 ...

  4. SpringCloud Hoxton版微服务- Gateway网关

    Gateway网关 一.Gateway概念 二.三大核心概念 1.Route (路由) 2.Predicate (断言) 3.Filter (过滤) 三.工作流程图 四.工程搭建 1.新建Gatewa ...

  5. Gateway网关-全局过滤器

    全局过滤器 上一节学习的过滤器,网关提供了31种,但每一种过滤器的作用都是固定的.如果我们希望拦截请求,做自己的业务逻辑则没办法实现. 全局过滤器作用 全局过滤器的作用也是处理一切进入网关的请求和微服 ...

  6. Gateway自定义全局过滤器

    一.Gateway全局过滤器 1.全局过滤器(Global Filters)简介 Gateway过滤器在实现方式上,有两种过滤器: GatewayFilter(局部过滤器/网关过滤器): 需要通过 s ...

  7. 【Spring Cloud】 Gateway网关 之 那些好玩的网关过滤器

    1.添加请求头的网关过滤 AddRequestHeader 匹配到的路由将添加指定的请求头和值 格式为 请求头名称 , 请求头值 server:port: 81 spring:cloud:gatewa ...

  8. GateWay 网关路由过滤器配置

    GatewayFilter 是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理. Spring提供了31种不同的路由过滤器工厂. 官方文档:Spring Cloud Gateway ...

  9. Gateway网关-过滤器链执行顺序

    过滤器执行顺序 请求进入网关会碰到三类过滤器:当前路由的过滤器.DefaultFilter.GlobalFilter 请求路由后,会将当前路由过滤器和DefaultFilter.GlobalFilte ...

  10. java 配置全局过滤器,如何为Spring Cloud Gateway加上全局过滤器

    既然是一个网关.那么全局过滤器肯定是少不了的一个存在.像是鉴权.认证啥的不可能每个服务都做一次,一般都是在网关处就搞定了. Zuul他就有很强大的过滤器体系来给人使用. Gateway当然也不会差这么 ...

最新文章

  1. cesium多边形描边_Cesium专栏-地形开挖2-任意多边形开挖(附源码下载)
  2. java应用之solr入门篇
  3. 台式电脑没鼠标怎么移动光标_台式机没有鼠标 怎么控制光标
  4. Elasticsearch2.3.2创建索引java代码及异常处理
  5. springboot导包显示不存在_BOOT项目依赖另外一个模块的包,开发的时候都正常,执行clean package打包成jar时却提示依赖的模块包不存在。...
  6. 安装caffe时出现“MySQL”不是内外不wenjian
  7. **网页静态化解决方案_Freemarker*
  8. 两年后,中国CF又站在了世界之巅
  9. 设计模式---003代理模式(转载自我的老师 Alley-巷子)
  10. 老鱼Python数据分析——篇十三:“选股宝”数据下载代码优化
  11. 华为首部鸿蒙,华为首部鸿蒙手机P50来了!顶级拍照再升级,麒麟芯片或绝唱
  12. 数据结构----主席树
  13. 反向传播与它的直观理解
  14. DSG招聘Oracle工程师、销售(南京、上海、南昌)
  15. “六度分离”理论——最短路问题
  16. 月薪5万 微软中国研究院 最新面试题
  17. cad快速看图电脑版使用
  18. 从页面仔到工程师,前端到底在发挥什么价值
  19. 基于java的银行账目管理系统
  20. 20100912武汉归来

热门文章

  1. 2021-10-11电子天平期间核查和日常核查管理方法
  2. C++基础之detele和detele[]
  3. python千位分隔符_31 python中format方法:字段宽度、精度和千位分隔符 符号、对齐和用0填充...
  4. 解决VScode中C语言中文乱码问题
  5. html常见基础标签大汇总
  6. 苹果手机计算机科学,手机科学计算器app_计算器软件应用推荐_iPhone_苹果ios_安卓...
  7. Adobe学习记录:PR常用快捷键
  8. pytorch ——torch.optim.Adam
  9. css中pc和pt,css中px和pt的区别是什么
  10. 华为虚拟化usb服务器,华为FusionComputer服务器虚拟化完美解决方案