我尝试获取响应标头,但无法获取任何内容

时间:2019-05-08 07:07:46

标签: spring-cloud-gateway

进入过滤器后,我想获取响应标头以查找响应是否被压缩,但什么也没得到。

我尝试从响应中getHeaders(),但是它为空。

public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String method = exchange.getRequest().getQueryParams().getFirst("method");

        String info = String.format("Method:{%s} Host:{%s} Path:{%s} Query:{%s} token:{%s}",
                exchange.getRequest().getMethod().name(),
                exchange.getRequest().getURI().getHost(),
                exchange.getRequest().getURI().getPath(),
                method,
                exchange.getRequest().getHeaders().getFirst(Constants.AUTHORIZE_TOKEN));
        exchange.getAttributes().put(START_TIME, System.currentTimeMillis());

        ServerHttpResponse originalResponse = exchange.getResponse();
        exchange.getRequest().getHeaders().getFirst("Content-Encoding");
//that result is null so i can't get Content-Encoding

我希望结果为gzip,但实际结果为null。

1 个答案:

答案 0 :(得分:0)

很明显,没有响应对象,因为未处理路由。

如果要检查响应,则必须在NettyRoutingFilter.filter(ServerWebExchange exchange, GatewayFilterChain chain)之后执行。

您可以按照以下方式进行操作。

public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    return chain.filter(exchange).thenEmpty(
        Mono.defer(() -> {
            ServerHttpResponse originalResponse = exchange.getResponse();
            originalResponse.getHeaders().getFirst("Content-Encoding");
            // your logic ...
            return Mono.empty();
        })
    );
}