SpringCloud学习(9)-GateWay网关-自定义拦截器

news/2024/11/14 12:37:56/

GateWay Filter详细配置说明

gateway Filter官网:Spring Cloud Gateway

作用:
  • 请求鉴权
  • 异常处理
  • 记录接口调用时长统计
过滤器类别
  • 全局默认过滤器:官网:Spring Cloud Gateway,出厂默认已有的,直接用,作用于所有的路由,不推荐。
  • 单一内置过滤器:官网:Spring Cloud Gateway,也可以称为网关过滤器,这种过滤器主要是作用于单一路由或者某个路由分组
  • 自定义过滤器
过滤器配置详解
常见内置过滤器

增删改请求头响应头

 spring:cloud:gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-service                #匹配后提供服务的路由地址predicates:- Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由filters:- AddRequestHeader=X-Request-username,value  # 请求头kv,若一头含有多参则重写一行设置- RemoveRequestHeader=sec-fetch-site  # 删除请求头sec-fetch-site- SetRequestHeader=sec-fetch-mode, Blue-updatebyzzyy # 将请求头sec-fetch-mode对应的值修改为Blue-updatebyzzyy- AddRequestParameter=customerId,9527001 # 新增请求参数Parameter:k ,v- RemoveRequestParameter=customerName   # 删除url请求参数customerName,你传递过来也是null- AddResponseHeader=X-Response-hello, BlueResponse # 新增响应参数X-Response-atguigu并设值为BlueResponse- SetResponseHeader=Date,2099-11-11 # 设置回应头Date值为2099-11-11- RemoveResponseHeader=Content-Type # 将默认自带Content-Type回应属性删除

对微服务路径和前缀进行配置:前缀修改

 spring:cloud:gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-service                #匹配后提供服务的路由地址predicates:#- Path=/pay/gateway/filter/**   # 被分拆为: PrefixPath + Path- Path=/gateway/filter/**              # 断言,为配合PrefixPath测试过滤,暂时注释掉/pay filters:- PrefixPath=/pay # http://localhost:9527/pay/gateway/filter

路径修改

 spring:cloud:gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-service                #匹配后提供服务的路由地址predicates:#- Path=/pay/gateway/filter/**   # 被分拆为: PrefixPath + Path- Path=/XYZ/abc/{segment}              # 断言,为配合SetPath测试,{segment}的内容最后被SetPath取代filters:- SetPath=/pay/gateway/{segment}  # {segment}表示占位符,你写abc也行但要上下一致

重定向

spring:cloud:gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-service                #匹配后提供服务的路由地址predicates:- Path=/gateway/filter/**              # 断言,为配合PrefixPath测试过滤,暂时注释掉/pay filters:- RedirectTo=302, http://www.baidu.com/ # 访问

自定义过滤器:自定义全局过滤器获取接口耗时(不用配置,默认全局生效)


import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/*** @author sun* @date 2024/4/1*/
@Slf4j
@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {public static final String START_VISIT_TIME = "startVisitTime";@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {exchange.getAttributes().put(START_VISIT_TIME, System.currentTimeMillis());return chain.filter(exchange).then(Mono.fromRunnable(() -> {Long startVisitTime = exchange.getAttribute(START_VISIT_TIME);if (startVisitTime != null) {long endVisitTime = System.currentTimeMillis();log.info("=================================================");log.info("访问接口主机: {}", exchange.getRequest().getURI().getHost());log.info("访问接口端口: {}", exchange.getRequest().getURI().getPort());log.info("访问接口URL: {}", exchange.getRequest().getURI().getPath());log.info("访问接口参数: {}", exchange.getRequest().getURI().getRawQuery());log.info("访问接口耗时: {}ms", (endVisitTime - startVisitTime));log.info("=================================================");}}));}// 数字越小优先级越高@Overridepublic int getOrder() {return -1;}
}

自定义过滤器:自定义单一过滤器(需要在配置文件设置)

import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;import java.util.List;/*** @author sun* @date 2024/4/1*/
@Slf4j
@Component
public class CustomSingleGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomSingleGatewayFilterFactory.Config> {public CustomSingleGatewayFilterFactory() {super(CustomSingleGatewayFilterFactory.Config.class);}@Overridepublic GatewayFilter apply(CustomSingleGatewayFilterFactory.Config config) {return (exchange, chain) -> {log.info("进入单一的过滤器 status: {}", config.getStatus());ServerHttpRequest request = exchange.getRequest();if (request.getQueryParams().containsKey(config.getStatus())) {return chain.filter(exchange);}exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);return exchange.getResponse().setComplete();};}@Overridepublic List<String> shortcutFieldOrder() {return List.of("status");}@Getter@Setterpublic static class Config {private String status; // 设置一个标志位, 匹配上才能访问}}

配置:


http://www.ppmy.cn/news/1416234.html

相关文章

Docker 学习笔记(五):梳理 Docker 镜像知识,附带 Commit 方式提交镜像副本,安装可视化面板 portainer

一、前言 记录时间 [2024-4-10] 前置文章&#xff1a; Docker学习笔记&#xff08;一&#xff09;&#xff1a;入门篇&#xff0c;Docker概述、基本组成等&#xff0c;对Docker有一个初步的认识 Docker学习笔记&#xff08;二&#xff09;&#xff1a;在Linux中部署Docker&…

深入理解Linux系统中的前后台任务与守护进程

⭐小白苦学IT的博客主页 ⭐初学者必看&#xff1a;Linux操作系统入门 ⭐代码仓库&#xff1a;Linux代码仓库 ❤关注我一起讨论和学习Linux系统 1.前言 在Linux系统中&#xff0c;进程管理是至关重要的一个环节。其中&#xff0c;前后台任务和守护进程是进程管理中不可忽视的两…

Mapbox 教程: 改变地图样式

注&#xff1a;相关功能在Mapbox GL JS v3中可用。在新版本中&#xff0c;默认使用标准样式&#xff0c;在创建地图时&#xff0c;可以在构造函数中明确指定style option 设置指定样式&#xff0c;也可以不设置style option 从而使用默认样式。 本示例通过Mapbox加载了一份带三…

Kyligence 发布企业级 AI 解决方案,Data + AI 落地迈向新阶段

4月11日&#xff0c;Kyligence 2024 数智论坛暨春季发布会成功召开。Kyligence 正式发布全新的企业级 AI 解决方案&#xff0c;基于服务金融、零售、制造、医药等行业领先客户的落地实践&#xff0c;Kyligence 为企业提供准确、可靠、智能的 AI 指标平台一站式解决方案&#x…

策略模式(Strategy Pattern)在JAVA中的应用

设计模式是软件工程中的一套被广泛认可的解决特定问题的最佳实践。它们是在多年的软件开发实践中总结出的有效方法。策略模式是JAVA中常用的一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每一个算法封装起来&#xff0c;使它们可以互换&#xff0c;让算法…

BUUCTF-Misc(1~4题)

一.签到 答案就在上面&#xff0c;输入&#xff1a;flag{buu-ctf} 二.金三胖 然后解压得到一个GIF图 大家清楚地看到闪过了两张红色的图片 方法一&#xff1a;使用GifSplitter 2.0 然后就可以在金三胖的文件夹里生成了每一帧的图片 可以看到答案是flag{he11ohongke} 方法二…

PostgreSQL入门到实战-第二十一弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(五)官网地址PostgreSQL概述PostgreSQL中RIGHT JOIN命令理论PostgreSQL中RIGHT JOIN命令实战更新计划 PostgreSQL中表连接操作(五) 使用PostgreSQL RIGHT JOIN连接两个表&#xff0c;并从右表返回行 官网地址 声明: 由于操作系统…

Js 的事件循环(Event Loop)机制

Js 的事件循环(Event Loop)机制 1、js是单线程的&#xff0c;会有阻塞问题 2、浏览器解决阻塞问题的方法&#xff1a;如网络请求、settimeout是用异步来做的&#xff0c;但异步任务没有优先级。为了更灵活&#xff0c;增加了事件循环 3、事件有同步任务和异步任务&#xff0c;先…