全局过滤器 GlobalFilter

简介: 全局过滤器 GlobalFilter

全局过滤器的作用是处理一切进入网关的请求和微服务响应

GlobalFilter的逻辑需要自己写代码实现。 定义方式是实现GlobalFilter接口,如下。

public interface GlobalFilter {
   /**
    *  处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理
    *
    * @param exchange 请求上下文,里面可以获取Request、Response等信息
    * @param chain 用来把请求委托给下一个过滤器 
    * @return {@code Mono<Void>} 返回标示当前过滤器业务结束    */
   Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

通过参数 exchange ,我们能拿到请求和响应的相关信息,也可以往里面存数据或取数据


参数 chain 就是过滤器链,这个链条上有很多过滤器,chain的作用是放行, 当此处的逻辑处理完后,就要交给其他过滤器处理,过滤器链的相关知识可以参考以下地址http://t.csdn.cn/CHdKz

http://t.csdn.cn/CHdKz

案例

需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:

  • 参数中是否有authorization,
  • authorization参数值是否为admin

如果同时满足则放行,否则拦截

@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
        // 2.获取authorization参数
        String auth = params.getFirst("authorization");
        // 3.校验
        if ("admin".equals(auth)) {
            // 放行
            return chain.filter(exchange);
        }
        // 4.拦截
        // 4.1 禁止访问
        exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        // 4.2 结束处理
        return exchange.getResponse().setComplete();
    }
}

从上往下看


@Order(-1) 该注解的作用是 定义过滤器的优先级 ,过滤链上可能会有很多过滤器,这个数值越大,优先级越小,越晚调用,其数值的范围是 -2147483646 ~ 2147483647 默认值是2147483647


@Component不解释了


在第 1 步中通过exchange获取到Request,从而获得参数


在第 3 步中 chain 调用了filter方法, chain也就只有这一个API,这个方法会调用过滤链的下一个过滤器的filter方法,即放行,而且该方法的返回值就是 Mono<Void>


在第 4 步中通过exchange获取到Response调用setStatusCode方法,返回状态码,该方法传入的参数只能是枚举HttpStatus,其中传入的HttpStatus.FORBIDDEN就是401状态码,表示为未登录

目录
相关文章
|
测试技术 开发工具 UED
什么是农场游戏系统开发规则玩法/详细需求/案例详情/源码项目
明确定义游戏概念和目标**: - 确定农场游戏系统的主题和核心玩法,明确目标用户群体,并设定明确的游戏目标和规则。
SpringBoot——SpringBoot中使用过滤器Filter的两种方式
SpringBoot——SpringBoot中使用过滤器Filter的两种方式
2729 0
SpringBoot——SpringBoot中使用过滤器Filter的两种方式
|
7月前
|
前端开发
鸿蒙开发:Canvas绘制之画笔对象Pen
Pen对象主要适用于修改图形形状的轮廓信息,可以修改的有,颜色,线宽,是否抗锯齿,透明度,线帽样式等等属性,当然了如果你想实现一个填充效果,需要切换Brush对象。
138 9
鸿蒙开发:Canvas绘制之画笔对象Pen
|
数据库 数据库管理 索引
主键和唯一键有什么区别?
【8月更文挑战第1天】
828 6
主键和唯一键有什么区别?
|
10月前
|
消息中间件 关系型数据库 MySQL
ClickHouse如何整合数据源:MySQL、HDFS...
ClickHouse 是一个强大的列式数据库管理系统,支持多种数据源。常见的数据源包括外部数据源(如 HDFS、File、URL、Kafka 和 RabbitMQ)、数据库(如 MySQL 和 PostgreSQL)和流式数据(如 Stream 和 Materialized Views)。本文介绍了如何从 MySQL 和 HDFS 读取数据到 ClickHouse 中,包括创建数据库、映射表和查询数据的具体步骤。通过这些方法,用户可以方便地将不同来源的数据导入 ClickHouse 进行高效存储和分析。
539 3
|
机器学习/深度学习 人工智能 算法
免费背景音人声分离解决方案MVSEP-MDX23,足以和Spleeter分庭抗礼
在音视频领域,把已经发布的混音歌曲或者音频文件逆向分离一直是世界性的课题。音波混合的物理特性导致在没有原始工程文件的情况下,将其还原和分离是一件很有难度的事情。 言及背景音人声分离技术,就不能不提Spleeter,它是一种用于音频源分离(音乐分离)的开源深度学习算法,由Deezer研究团队开发。使用的是一个性能取向的音源分离算法,并且为用户提供了已经预训练好的模型,能够开箱即用,这也是Spleeter泛用性高的原因之一,关于Spleeter,请移步:[人工智能AI库Spleeter免费人声和背景音乐分离实践(Python3.10)](https://v3u.cn/a_id_305),这里
免费背景音人声分离解决方案MVSEP-MDX23,足以和Spleeter分庭抗礼
|
消息中间件 大数据 Kafka
Kafka消息封装揭秘:从Producer到Consumer,一文掌握高效传输的秘诀!
【8月更文挑战第24天】在分布式消息队列领域,Apache Kafka因其实现的高吞吐量、良好的可扩展性和数据持久性备受开发者青睐。Kafka中的消息以Record形式存在,包括固定的头部与可变长度的消息体。生产者(Producer)将消息封装为`ProducerRecord`对象后发送;消费者(Consumer)则从Broker拉取并解析为`ConsumerRecord`。消息格式简化示意如下:消息头 + 键长度 + 键 + 值长度 + 值。键和值均为字节数组,需使用特定的序列化/反序列化器。理解Kafka的消息封装机制对于实现高效、可靠的数据传输至关重要。
374 4
|
监控 Linux Shell
Linux系统中如何查看磁盘情况
【7月更文挑战第11天】在Linux中,`df -h`展示文件系统磁盘使用概览;`du -sh /path`估计特定目录的磁盘占用;`fdisk -l`列出磁盘分区详情;`lsblk`以树状展示块设备信息。这些命令帮助监控磁盘状态,适时管理空间。
869 0
|
文字识别 Java Maven
java调用tess4j识别图像中的文字
java调用tess4j识别图像中的文字
726 3
|
NoSQL MongoDB 数据库
MongoDB索引:加速查询、提升性能的利器
MongoDB索引:加速查询、提升性能的利器
206 0