spring cloud gateway 之删除请求头

embedded/2024/9/23 4:35:46/

在使用spring gateway作为网关时,我们经常需要在将请求转发到下游服务时,过滤掉某些请求头,以避免不必要的信息泄露,而spring gateway提供了RemoveRequestHeader内置的过滤器帮我们实现该功能,此外,我们也可以通过实现自定义的过滤器来实现。

RemoveRequestHeader——特定的路由

我们可以基于内置的RemoveRequestHeader,在将请求转发到特定的下游服务时,过滤掉特定的请求头。

单个请求头

例如,我们需要移除Authorization请求头,如下所示:

spring:cloud:gateway:routes:- id: remove_header_routeuri: http://httpbin.orgpredicates:- Path=/remove-header/**filters:- RemoveRequestHeader=Authorization  # 移除 Authorization 请求头

如上,filters中,列表中定义了多个过滤器。这里我们使用 RemoveRequestHeader 过滤器来移除 Authorization 请求头。请求流程如下:

  • 当客户端请求 http://localhost:8080/remove-header/some-endpoint 时,Spring Cloud Gateway 会匹配到上述配置的路由。
  • 在请求被转发到 http://httpbin.org 之前,RemoveRequestHeader 过滤器会移除请求中的 Authorization 头部。
  • 最终,转发到 httpbin.org 的请求将不会包含 Authorization 头部

多个请求头

如果你需要移除多个请求头,可以在 filters 列表中多次使用 RemoveRequestHeader 过滤器。例如:

spring:cloud:gateway:routes:- id: remove_multiple_headers_routeuri: http://httpbin.orgpredicates:- Path=/remove-headers/**filters:- RemoveRequestHeader=Authorization- RemoveRequestHeader=Cookie  # 也移除 Cookie 请求头

RemoveRequestHeader——所有路由

如果你希望 RemoveRequestHeader 过滤器应用于所有的路由,即对所有通过 Spring Cloud Gateway 的请求都移除某些请求头,你可以通过配置一个全局过滤器来实现。这可以在 application.yml 中配置全局过滤器,或通过编写自定义的全局过滤器来实现。

使用全局过滤器配置 RemoveRequestHeader

application.yml 中配置 RemoveRequestHeader 作为全局过滤器,这样它就会应用于所有路由。

示例:全局移除 Authorization 请求头
spring:cloud:gateway:default-filters:- RemoveRequestHeader=Authorization  # 移除 Authorization 请求头
  • default-filters: 这是 Spring Cloud Gateway 提供的一个配置选项,可以用于定义应用于所有路由的默认过滤器。配置在这里的过滤器会在每个路由上自动生效。

  • RemoveRequestHeader=Authorization: 这个过滤器配置移除了所有请求中的 Authorization 头部。

  • 不论客户端请求哪个路径,例如 http://localhost:8080/api/endpoint1http://localhost:8080/service/endpoint2Authorization 头部都会在请求转发到下游服务之前被移除。

  • 这意味着所有通过 Spring Cloud Gateway 的请求都会自动执行这个过滤器,无需为每个路由单独配置。

移除多个请求头

如果需要移除多个请求头,可以在 default-filters 中配置多个 RemoveRequestHeader 过滤器。例如:

spring:cloud:gateway:default-filters:- RemoveRequestHeader=Authorization- RemoveRequestHeader=Cookie  # 也移除 Cookie 请求头

自定义全局过滤器

除了使用 default-filters 配置,你还可以创建自定义的全局过滤器来实现相同的功能。以下是一个示例代码:

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.core.annotation.Order;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;/*** 删除请求头中的信息*/
@Slf4j
@Component
@Order(Ordered.HIGHEST_PRECEDENCE + AuthConstant.AUTH_OFFSET + 7)
public class RemoveAuthHeaderFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest().mutate().headers(httpHeaders -> httpHeaders.remove("Authorization")).headers(httpHeaders -> httpHeaders.remove("Cookie")).headers(httpHeaders -> httpHeaders.remove(AuthConstant.PERMISSION_STATUS)).build();ServerWebExchange mutatedExchange = exchange.mutate().request(request).build();return chain.filter(mutatedExchange);}
}

结论

通过配置 default-filters,你可以轻松地将 RemoveRequestHeader 应用于所有的路由。这是一个强大的功能,适用于需要对所有请求进行统一头部管理的场景。此外,为了更加灵活的控制,可以使用自定义的全局过滤器,再次可以根据各种条件判断来处理是否需要移除某个请求头,灵活性和扩展性都很好。


http://www.ppmy.cn/embedded/107377.html

相关文章

父类是给java项目SpringCloud微服务 中SpringBoot解决继承父类后 maven标红

解决继承父类后 maven标红 问题: Project: org.example:SpringCloud_wfw:1.0-SNAPSHOTLocation:: X:/SpringCloud_微服务/pom.xml Problems:packaging with value jar is invalid. Aggregator projects require pom a 父类中packaging改成pom Maven父类中packaging改成pom &…

PDF到CAD转换:四大实用工具指南!

将纸质图纸或PDF文件转化为可编辑的CAD文件是一项基本技能。无论是为了更好地进行团队协作&#xff0c;还是为了简化设计流程&#xff0c;找到一个合适的PDF转CAD工具都是至关重要的。本文将深入探讨几款主流工具的功能特色&#xff0c;并结合实际使用经验分享个人见解。 福昕…

【时时三省】(C语言基础)指针进阶 例题2

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 第一个arr 数组名相当于首元素地址 因为他没有放到strlen内部 也没有取地址 strlen是找&#xff3c;0 找不到&#xff3c;0就不会停下来 所以它打印的就是随机值 第二个arr0 首元素地址加零还…

USER_CROSSING_SLR

在堆叠硅互连&#xff08;SSI&#xff09;设备上放置设计元素时&#xff0c;您可以使用 要管理的USER_SLR_ASSIGNMENT、USER_CROSSING_SLR和USER_SLL_REG属性 逻辑分区和Vivado放置工具的行为。SSI设备由以下部分组成 多个超逻辑区域&#xff08;SLR&#xff09;&#xff0c;由…

如何在Mac中修改pip的镜像源

一. 修改步骤 进入命令行 进入到用户根目录 cd ~/在用户根目录下创建 .pip 文件夹 mkdir .pip进入到 ~/.pip 文件夹内 cd ~/.pip创建 pip.conf 文件 vim pip.conf在 pip.conf 文件中添加清华大学的镜像源&#xff0c;如下&#xff1a; [global] index-urlhttps://pypi.tuna.ts…

任务栏透明怎么设置?适配最新版 Windows 电脑的方法介绍(图文教程)

电脑任务栏作为Windows操作系统中的一个重要组件&#xff0c;部分用户对于任务栏的了解比较少&#xff0c;经常会遇到任务栏消失、任务栏透明度不会设置的问题。本文一一给大家科普关于Windows任务栏的知识&#xff0c;以及设置任务栏透明的技巧。 一、什么是任务栏 电脑任务栏…

Collection的子接口List系列集合

一、Collection 1.集合的概述 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素&#xff1b;它提供更具体的子接口(如Set和List)实现。 2.Collection的常用方法 方法名说明boolean add(E e)添加元素boolean remove(Object o)从集合中移除指定的元素boolea…

前端基础解析

一、HTML 基础 HTML&#xff08;HyperText Markup Language&#xff09;即超文本标记语言&#xff0c;是构建网页的基础。它通过各种标签来定义网页的结构和内容。 1. 常用标签 <html>&#xff1a;定义整个 HTML 文档。<head>&#xff1a;包含文档的元数据&#xf…