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

相关推荐
魏波.8 天前
BasicAuthenticationFilter处理 HTTP 基本认证(Basic Authentication)的核心过滤器详解
过滤器
Java牛马9 天前
SpringCloud之Gateway
网关·spring cloud·gateway·路由·过滤器·断言
abcnull2 个月前
springboot中过滤器配置使用
java·spring boot·后端·springmvc·过滤器
未来影子3 个月前
布隆过滤器和布谷鸟过滤器
过滤器·布隆过滤器·布谷鸟过滤器
阿绵4 个月前
拦截器和过滤器详解
java·spring·过滤器·拦截器
shangxianjiao4 个月前
Javaweb后端登录认证 登录校验 过滤器 filter令牌校验,执行流程,拦截路径
java·springboot·springcloud·过滤器
contact976 个月前
.NET Core中的五种过滤器详解
.netcore·过滤器
问道飞鱼7 个月前
【Springboot知识】Springboot基础-过滤器与拦截器开发
java·spring boot·后端·过滤器·拦截器
岁岁岁平安8 个月前
JavaWeb学习(6)(核心三大组件、过滤器(Filter)原理、配置过滤器与error页面)
java·学习·servlet·web·过滤器·filter
morris1319 个月前
【SpringBoot】使用过滤器进行XSS防御
spring boot·xss·过滤器