SpringCloud Gateway 自定义Filter用代码怎么写?别再说我只会配置基本Filter了,来学学如何定制Filter过滤器

news2025/7/20 13:47:05

文章目录

  • 学习SpringCloud Gateway
  • 自定义全局Filter(GlobalFilter)
  • ServerWebExchange
  • 自定义非全局Filter(GatewayFilter)

学习SpringCloud Gateway

SpringCloud Gateway使用及原理分析大全——断言及过滤器(上篇)
SpringCloud Gateway使用及原理分析大全(下篇)

自定义全局Filter(GlobalFilter)


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.nio.charset.StandardCharsets;

/**
 * 作为一个Bean放在容器中即可生效
 * 
 * 注意:Gateway只支持响应式,所有的语法都需要使用响应式的语法
 */
@Component
public class MyFilter implements GlobalFilter, Ordered {

    public static final Logger logger = LoggerFactory.getLogger(SessionIdFilter.class);

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        // exchange可以获取到http请求的所有东西
        HttpHeaders headers = exchange.getRequest().getHeaders();
        String uname = exchange.getRequest().getQueryParams().getFirst("uname");

        if(headers == null){
            // 可以手动写回请求,直接拦截住不放行
            ServerHttpResponse response = exchange.getResponse();
            String errorInfo = "{\"code\": 401,\"success\": false}";
            DataBuffer buffer = response.bufferFactory().wrap(errorInfo.getBytes(StandardCharsets.UTF_8));
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            response.getHeaders().set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
            // 注意,这里如果不需要写信息的话,可以直接return response.setComplete();
            return response.writeWith(Mono.just(buffer));
        }

        // 放行,进入下一个拦截器链
        return chain.filter(exchange);
    }

    /**
     * 优先级顺序,数字越小优先级越高
     */
    @Override
    public int getOrder() {
        return Integer.MIN_VALUE;
    }

}

ServerWebExchange

ServerWebExchange是一个响应式接口类,它提供对HTTP请求和响应的访问,还公开其他与服务器端处理相关的属性和特性,如请求属性。

在这里,你几乎可以拿到所有的请求属性和响应。
在这里插入图片描述

自定义非全局Filter(GatewayFilter)

其实,GatewayFilter和GlobalFilter用法是一样的,但是GatewayFilter只能用于限定的路由,比如说可以这样用:

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder, MyFilter filter) {
    return builder.routes()
            .route(r -> r.host("**.abc.org").and().path("/image/png")
                    .filters(f ->
                            f.filter(filter)) // 此处定义GatewayFilter,不能用GlobalFilter
                    .uri("http://httpbin.org:80")
            )
            .build();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【openwrt】libubox组件——uloop_process

uloop_processuloop_process主要数据结构struct list_head processesstruct uloop_processuloop_process主要函数uloop_handle_processesuloop_process原理uloop_process使用示例uloop_process 是 Libubox 提供的一个进程管理工具,它主要用来等待子进程工作的结束&#xff0c;一…

DAP和IAP

DAP和IAP DAP模型&#xff1a;通过训练样本学习一组属性分类器直接预测测试样本的属性。 IAP模型&#xff1a;通过训练样本的类别&#xff0c;&#xff08;多分类器&#xff09;间接预测测试样本的属性。 两者之间的区别&#xff1a;属性分类器的学习方式&#xff0c;DAP是一组…

labelme做标注

1.anaconda 安装 anaconda下载地址如下&#xff1a; 官网 一直下一步&#xff0c;注意下面这个地方 同时手动配置环境变量&#xff0c;下面三个路径需添加 Anaconda安装路径 Anaconda安装路径\Scripts Anaconda安装路径\Library\bin 最后测试一下 cmd 依次输入 conda…

云原生周刊 | 百家争鸣的边缘计算时代即将到来?| 2022-11-14

今年的 KubeCon 大会有一个很奇怪的现象&#xff0c;到场的几乎都是小公司&#xff0c;没有大公司。可能是因为这些大公司恰好在这个时候都有自己的活动要举办&#xff0c;也有可能是他们正在快马加鞭研发他们的边缘计算方案&#xff1f;因为 Gartner 预测到 2025 年&#xff0…

Mybatis—LanguageDriver

LanguageDriver主要用于构造SqlSource和ParameterHandler&#xff0c;从LanguageDriver在Mybatis中调用链路来看&#xff0c;Configuration#newParameterHandler通过调用LanguageDriver#createParameterHandler完成构建ParameterHandler&#xff0c;通过调用LanguageDriver#cre…

缺流量时代,App们需要如何突围?

距离上一个现象级的应用抖音出现已经过去了6年&#xff0c;如今App市场万马齐喑&#xff0c;巨头创新不断&#xff0c;中小团队异军突起的App黄金时代一去不返。 你的App里多久没有出现过一款新应用了&#xff1f; 距离上一个现象级的应用抖音出现已经过去了6年&#xff0c;那…

基于加权对立和贪婪搜索多模态工程问题的黑猩猩优化算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【网络安全】处理应急响应的简单方法

目录 一、应急响应 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;分类 二、如何处理 &#xff08;1&#xff09;查看日志 &#xff08;2&#xff09;封堵ip &#xff08;3&#xff09;代码加固 &#xff08;4&#xff09;安装防火墙 &#xff08;5&#x…

sqli通关笔记

sqli通关学习笔记 目录sqli通关学习笔记Less-1Less-2Less-3Less-4Less-5Less-5Less-6导入导出文件相关的操作Less-7Less-8Less-9Less-10Less-11Less-12Less-13Less-14Less-15Less-16增删改函数介绍Less-17HTTP 头部介绍Less-18Less-19Less-20Less-21Less-22高级注入&#xff0c…

【网络篇】第十四篇——HTTP协议(一)(附带电视剧李浔同款爱心+端口号被恶意占用如何清除)

目录 HTTP简介 基本性质 URI和URL urlencode和urldecode HTTP协议格式 HTTP请求协议格式 HTTP响应协议格式(爱心代码端口清理) ​ HTTP简介 超文本传输协议是一个用于传输超媒体文档的应用层协议。它是为web浏览器与web服务器之间的通信而设计的&#xff0c;但也可以用…

【DPDK】使用 Open vSwitch * 采用 DPDK 帧间 VM NFV 应用程序

一、概述 数据面开发套件 (DPDK)提供高性能数据包处理库和用户空间驱动程序。从Open vSwitch (OVS)版本 2.4 (http://openvswitch.org/releases/NEWS-2.4.0)开始&#xff0c;我们可以进行 OVS 中&#xff0c;使用 DPDK 优化 vHost 路径。DPDK 支持后的 OVS 中可用的 2.2 版。 …

JavaSE——包装类、装箱与拆箱

目录 一、基本概念 1.1 八种包装类及使用场景 1.2 装箱与拆箱的概念 二、以Integer包装类为例 2.1 Integer的构造方法 2.2 通过常量获取最大值与最小值 2.3 自动装箱和自动拆箱&#xff08;非常重要的面试题&#xff09; 三、Integer常用方法 3.1 手动拆箱&#xff08;过时…

LeetCode-剑指44-数字序列中某一位的数字

1、找规律 我们通过找规律可以发现&#xff0c;当位数为xxx时&#xff0c;其占用的位数为x910x−1x\times9\times10^{x-1}x910x−1。因此我们可以不断循环并增大位数xxx直至n−x<x910x−1n-x<x\times9\times10^{x-1}n−x<x910x−1&#xff0c;此时数字落在剩余的位数…

HTTP协议加强

HTTP协议加强[TOC](HTTP协议加强)一、HTTP协议简介1.1 什么是通信1.2 什么是通信协议1.3 HTTP二、HTTP请求2.1 什么是HTTP请求消息2.2 HTTP请求消息的组成部分三、HTTP响应3.1 什么是HTTP响应消息3.2 HTTP响应消息的组成部分四、HTTP请求方法4.1 什么是HTTP请求方法4.2 HTTP的请…

接口性能调优的方法,这有11种,你知道几种?

​当我们谈到“软件测试”时&#xff0c;是指软件测试的相关工作&#xff0c;如单元测试、集成测试、系统测试等&#xff0c;但不局限于动态测试&#xff0c;也可以包括静态测试——需求评审、设计评审、代码评审和借助工具进行代码静态分析。 接口性能调优共11种方法&#xf…

Nftea: 世界杯文化、 NFT与 期权的首度碰撞

体育文化&#xff0c;正在成为加密行业发展的新驱动力 卡塔尔世界杯即将在2022年11月20日开幕&#xff0c;随着开赛日期的临近&#xff0c;作为四年一度的足球狂欢盛会&#xff0c;也吊足了全球足球球迷们的胃口。当然&#xff0c;从上个世纪开始&#xff0c;体育文化就成为了商…

Slurm作业管理系统常用命令和教程

Slurm &#xff08; Simple Linux Utility for Resource Management &#xff09;是开源的、具有容错性和高度可扩展大型和小型 Linux集群资源管理和作业调度系统。超级计算系统可利用 Slurm 进行资源和作业管理&#xff0c;以避免相互干扰&#xff0c;提高运行效率。所有需运行…

charles

charles中文名叫青花瓷&#xff0c;是一款基于HTTP协议的代理服务器。通过电脑或浏览器的代理来截取请求和请求结果&#xff0c;达到抓包并进行数据分析的目的。charles可以截取HTTP和HTTPS的网络封包&#xff0c;支持重发网络请求、修改网络请求参数、流量控制等场景 安装 由…

LeetCode刷题(python版)——Topic65.有效数字

一、题设 有效数字&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 一个 小数 或者 整数&#xff08;可选&#xff09;一个 e 或 E &#xff0c;后面跟着一个 整数 小数&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; &#xff08;可选&…

Vue:搭建前端项目-----我给你打个样

如果文章对你有帮助欢迎【关注❤️❤️❤️点赞&#x1f44d;&#x1f44d;&#x1f44d;收藏⭐⭐⭐】一键三连&#xff01;一起努力&#xff01; 家人们好久不见&#xff0c;这次我们继续上干货&#xff0c;我们来介绍一下如何使用vue搭建一个前端项目&#xff1b; 在这里我会…