在使用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/endpoint1
或http://localhost:8080/service/endpoint2
,Authorization
头部都会在请求转发到下游服务之前被移除。 -
这意味着所有通过 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
应用于所有的路由。这是一个强大的功能,适用于需要对所有请求进行统一头部管理的场景。此外,为了更加灵活的控制,可以使用自定义的全局过滤器,再次可以根据各种条件判断来处理是否需要移除某个请求头,灵活性和扩展性都很好。