如何在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
相关产品推荐
相关产品推荐

