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

相关推荐
Roye_ack3 天前
【微服务 Day3】SpringCloud实战开发(网关路由 + 网关登录校验 + 自定义过滤器 + 配置共享 + 配置热更新 + 动态路由)
网关·spring cloud·微服务·架构·过滤器·拦截器·配置管理
七夜zippoe8 天前
Spring MVC请求处理流程源码分析与DispatcherServlet核心逻辑
java·spring·mvc·过滤器·拦截器
哈哈~haha23 天前
UI5_Walkthrough_Step 23: Filtering 过滤器
过滤器·filtering
fatfishccc4 个月前
Spring MVC 全解析:从核心原理到 SSM 整合实战 (附完整源码)
java·spring·ajax·mvc·ssm·过滤器·拦截器interceptor
魏波.5 个月前
BasicAuthenticationFilter处理 HTTP 基本认证(Basic Authentication)的核心过滤器详解
过滤器
Java牛马5 个月前
SpringCloud之Gateway
网关·spring cloud·gateway·路由·过滤器·断言
abcnull7 个月前
springboot中过滤器配置使用
java·spring boot·后端·springmvc·过滤器
未来影子8 个月前
布隆过滤器和布谷鸟过滤器
过滤器·布隆过滤器·布谷鸟过滤器
阿绵9 个月前
拦截器和过滤器详解
java·spring·过滤器·拦截器