过滤器的作用:过滤器就是在请求的过程中,对请求和响应做一些手脚

生命周期:Pre Post

分类:局部过滤器(作用在某一个路由上)  全局过滤器(作用在全部路由上)

在Gateway中,Filter的生命周期只有两个:“pre”和“post”。

  • PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。

  • POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。

目录

1 局部过滤器

1.1 内置局部过滤器

1.2 内置过滤器的使用

1.3 自定义局部过滤器

2 全局过滤器

2.1 内置的全局过滤器

2.2 自定义全局过滤器


1 局部过滤器

局部过滤器是针对单个路由的过滤器。

1.1 内置局部过滤器

在SpringCloud Gateway中内置了很多不同类型的网关路由过滤器。具体如下:

1.2 内置过滤器的使用

下面示例SetStatus过滤器工厂的使用:

第一步:配置文件中加入过滤器

server:port: 7000
spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: localhost:8848   # nacos服务端地址gateway:discovery:locator:enabled: true # 启用探测器,让gateway可以发现nacos中的微服务routes: # 路由数组(路由:就是当指定请求满足什么条件的时候,转发到哪个微服务)- id: product_route  # 当前路由的标识,要求唯一。默认uuiduri: lb://service-product # lb指的是负载均衡(load balancing),service-product是nacos中微服务的名称order: 1  # 路由的优先级,数字越小级别越高predicates: # 断言(就是路由转发要满足的条件)- Path=/product-serv/** # 当请求路径满足Path指定的规则时,才进行路由转发filters:  # 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改- StripPrefix=1 # 转发之前去掉1层路径- SetStatus=250 # 修改原始响应的状态码

第二步:启动测试

1.3 自定义局部过滤器

需求:通过过滤器,配置是否在控制台输出日志信息,以及是否记录日志。

第一步:在配置文件中,添加一个Log的过滤器配置

server:port: 7000
spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: localhost:8848   # nacos服务端地址gateway:discovery:locator:enabled: true # 启用探测器,让gateway可以发现nacos中的微服务routes: # 路由数组(路由:就是当指定请求满足什么条件的时候,转发到哪个微服务)- id: product_route  # 当前路由的标识,要求唯一。默认uuiduri: lb://service-product # lb指的是负载均衡(load balancing),service-product是nacos中微服务的名称order: 1  # 路由的优先级,数字越小级别越高predicates: # 断言(就是路由转发要满足的条件)- Path=/product-serv/** # 当请求路径满足Path指定的规则时,才进行路由转发filters:  # 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改- StripPrefix=1 # 转发之前去掉1层路径- Log=true,false  # 控制日志是否开启

第二步:自定义一个过滤器工厂,实现里面的方法

package cn.jack.filter;import lombok.Data;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;import java.util.Arrays;
import java.util.List;@Component
public class LogGatewayFilterFactory extends AbstractGatewayFilterFactory<LogGatewayFilterFactory.Config>{public LogGatewayFilterFactory() {super(Config.class);}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("consoleLog", "cacheLog");}@Overridepublic GatewayFilter apply(Config config) {return ((exchange, chain) -> {if (config.consoleLog) {System.out.println("console日志已开启...");}if (config.cacheLog) {System.out.println("cache日志已开启...");}return chain.filter(exchange);});}@Datapublic static class Config{private boolean consoleLog;private boolean cacheLog;}
}

第三步:运行测试

2 全局过滤器

全局过滤器作用于所有路由,无需配置。通过全局过滤器可以实现对权限的统一校验,安全性验证等功能。

2.1 内置的全局过滤器

SpringCloud Gateway内部也是通过一系列的内置全局过滤器对整个路由转发进行处理的。

2.2 自定义全局过滤器

示例通过自定义全局过滤器,完成统一的权限校验。

开发中的鉴权逻辑:

  • 当客户端第一次请求服务时,服务端对用户进行信息认证(登录)
  • 认证通过,将用户信息进行加密形成token,返回给客户端,作为登录凭证
  • 以后每次请求,客户端都携带认证的token
  • 服务端对token进行解密,判断是否有效。

如下图,对于验证用户是否已经登录及鉴权的过程,可以在网关统一校验。

校验的标准就是请求中是否携带token凭证,以及token的正确性。

下面我们通过自定义一个GlobalFIlter,去校验所有请求的请求参数中是否包含“token”,如果不包含请求参数“token”则不转发路由,否则执行正常逻辑。

package cn.jack.filter;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.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;/*** 自定义全局过滤器,需要实现GlobalFilter和Ordered接口*/
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {// 完成鉴权逻辑@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getQueryParams().getFirst("token");if (StringUtils.isEmpty(token)) {System.out.println("鉴权失败。确少token参数。");exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}if (!"jack".equals(token)) {System.out.println("token无效...");exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}// 继续执行filter链return chain.filter(exchange);}// 顺序,数值越小,优先级越高@Overridepublic int getOrder() {return 0;}
}

启动测试:

Gateway之过滤器相关推荐

  1. Spring Cloud Gateway(过滤器)

    在上一篇文章中,我们了解了 Spring Cloud Gateway 作为网关所具备的基础功能:路由.本篇我们将关注它的另一个功能:过滤器. Spring Cloud Gateway 已经内置了很多实 ...

  2. SpringCloud Alibaba 2021微服务实战十三 gateway 全局过滤器打印日志及如何忽略全局过滤器

    API 网关的职能 API 网关的分类与功能 下面讲解自定义过滤器 之记录日志功能应用! 全局过滤器拦截请求打印日志: 代码: package com.liu.learn.filter;import ...

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

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

  4. 微服务中自定义gateway网关过滤器

    在学习spring Cloud时,gateway作为服务统一入口,经常需要对来历不明的请求做一些筛选. 官方提供了一些常用的过滤器 filters:- AddRequestHeader=name,zs ...

  5. gateway自定义过滤器

    目录 全局过滤器(GloabalFilter) 前置过滤器 后置过滤器 运行结果 局部过滤器 局部过滤器实现 在gateway的启动类上进行注册 对应的配置文件部分 运行结果 全局过滤器(Gloaba ...

  6. Spring Cloud GateWay——Filter过滤器

    基于SpringCloud GateWay 3.1.2 版本 内置过滤器 Spring Cloud GateWay 内置了下图中的过滤器,具体的内置过滤器如何使用,可参考官网文档,描述都很简单,本文重 ...

  7. gateway中的局部过滤器_Spring Cloud Gateway中的过滤器工厂:重试过滤器

    Spring Cloud Gateway基于Spring Boot 2,是Spring Cloud的全新项目,该项目提供了一个构建在Spring 生态之上的API网关.本文基于的Spring Clou ...

  8. Gateway自定义全局过滤器

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

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

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

  10. spring cloud gateway之filter篇

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 在上一篇文章详细的介绍了Gateway的Predict,Predict决定了请求由哪一个路由处理, ...

最新文章

  1. weedfs java_初窥weedfs分布式文件系统
  2. 李天华:2017年短视频最值得投入的战略性方向
  3. centos+nginx+php+mysql(经典架构流程案例)
  4. java 调用.net webservice axis2_java利用axis2调用.net写的webservice,传递自定义的实体类参数...
  5. 前端组件:layui
  6. 数据库性能优化—MySQL单表最大记录数超过多少时性能会严重下降
  7. oracle 自增1,oracle自增无法从1开始
  8. EF Core 插件 —— ToSql
  9. ZKEACMS for .Net Core 深度解析
  10. HugeGraphServer 部署安装
  11. ubuntu常用的一些命令
  12. km算法c语言,KM算法最好的讲解+POJ2195[KM算法+最小费用流]
  13. android Activity的Task Affinity lanchMode
  14. Raki的统计学习方法笔记0x1章:统计学习及监督学习概论
  15. Python电子书下载
  16. 最新版AltiumDesignerSummer9下载+破解
  17. MovieLens推荐系统数据集官方文档+解释
  18. 初识instantRun
  19. oracle数据投毒,Oracle Database Server 'TNS Listener'远程数据投毒漏洞
  20. android接入支付宝自动续费,APP是如何实现自动续费的?

热门文章

  1. CC2430 CC2530 AD转换分辨率之“争”
  2. 全球十大农业大数据经典案例
  3. c语言汉字属于什么类型_【C语言】必学知识点 - 基本数据类型!你学会了吗?...
  4. 实现平方根函数sqrt
  5. 重置linux红帽登录密码,红帽(RHEL)Linux 忘记root密码后重置密码
  6. Java 插入、隐藏/显示、删除Excel行或列
  7. 优化百度ueditor编辑器,增加秀米插件、手机端预览等功能,与egg-ueditor完美结合
  8. 如何使用shell限制指定用户shell程序的网络带宽
  9. RINEX3文件中的toc,toe,IODE区分和了解
  10. 微信小程序中如何有效的修改app.js中全局变量的值,并能在页面中进行动态响应