You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Cloud Gateway中结合请求体添加HTTP签名与Digest头?

解决方案:在Spring Cloud Gateway中同时处理请求体并添加请求头

直接使用addRequestHeader()无法同时访问请求体,因为这个过滤器是独立执行的,无法获取请求体内容来生成你需要的Digest头。正确的做法是在modifyRequestBody()的处理逻辑里,同时完成请求体的读取、Digest的计算以及请求头的添加,不需要单独调用addRequestHeader()。

示例代码实现

.filters(f -> {
    return f.modifyRequestBody(String.class, String.class, (exchange, requestBody) -> {
        // 1. 基于请求体计算Digest头的值(这里以SHA-256为例)
        String digest;
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] hashBytes = md.digest(requestBody.getBytes(StandardCharsets.UTF_8));
            digest = "SHA-256=" + Base64.getEncoder().encodeToString(hashBytes);
        } catch (NoSuchAlgorithmException e) {
            return Mono.error(new RuntimeException("Failed to calculate Digest", e));
        }

        // 2. 创建新的请求对象,添加Digest请求头
        ServerHttpRequest updatedRequest = exchange.getRequest().mutate()
                .header("Digest", digest)
                .build();

        // 3. 更新当前exchange的请求实例
        exchange.mutate().request(updatedRequest).build();

        // 4. 返回处理后的请求体(不需要修改内容则直接返回原body)
        return Mono.just(requestBody);
    });
})

关键说明

  • ServerHttpRequest是不可变对象,所以需要通过mutate()创建新的请求实例来添加头信息,再替换掉exchange中的原请求。
  • 如果你的请求体不是String类型,可以修改modifyRequestBody()的泛型参数(比如byte[].class),适配不同的请求体格式。
  • 异常处理要包裹在Mono的错误流中,避免网关过滤器链中断。

内容的提问来源于stack exchange,提问作者Vegard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:24:22