spring cloud gateway 之删除请求头

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

RemoveRequestHeader------特定的路由

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

单个请求头

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

spring:
  cloud:
    gateway:
      routes:
        - id: remove_header_route
          uri: http://httpbin.org
          predicates:
            - 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_route
          uri: http://httpbin.org
          predicates:
            - 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 {
    @Override
    public 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 应用于所有的路由。这是一个强大的功能,适用于需要对所有请求进行统一头部管理的场景。此外,为了更加灵活的控制,可以使用自定义的全局过滤器,再次可以根据各种条件判断来处理是否需要移除某个请求头,灵活性和扩展性都很好。

相关推荐
无理 Java2 个月前
【过滤器 vs 拦截器】SpringBoot中过滤器与拦截器:明智选择的艺术(如何在项目中做出明智选择)
java·spring boot·后端·面试·实战·过滤器·拦截器
fatfishccc3 个月前
SpringMVC
mvc·springmvc·restful·mvvm·过滤器·controller·拦截器
风吹千里3 个月前
Spring Web MVC之过滤器Filter和拦截器HandlerInterceptor的区别和用法
前端·spring·tomcat·mvc·过滤器·拦截器·filter
栗子叶3 个月前
【设计模式】行为型设计模式之 职责链模式,探究过滤器、拦截器、Mybatis插件的底层原理
java·设计模式·mybatis·过滤器·拦截器·职责链模式
韩曙亮4 个月前
【FFmpeg】Filter 过滤器 ① ( FFmpeg 过滤器简介 | 过滤器概念 | 过滤器用法 | 过滤器工作流程 | 过滤器文档 | 过滤器分类 )
ffmpeg·音视频·过滤器·滤镜·滤镜连·ffmpeg过滤器·过滤器工作流程
码农爱java5 个月前
Spring Boot 处理过滤器(filter )中抛出的异常
spring boot·spring·servlet·异常处理·过滤器·拦截器·filter
Json____5 个月前
springboot在使用 Servlet API中提供的javax.servlet.Filter 过滤器 对请求参数 和 响应参数 进行获取并记录日志方案
hive·spring boot·servlet·过滤器·filter
Davieyang.D.Y5 个月前
互联网轻量级框架整合之JavaEE基础II
java-ee·过滤器·监听器·servlet初始化
一个搬砖的农民工6 个月前
Java中过滤器和拦截器区别
java·spring·过滤器·拦截器