RestClient 通过拦截器实现请求加密

今天我发现了一个关于请求加密的有效写法,特此分享给大家。如果你的加密需求是将请求参数也包含在内,通常情况下,我们需要先将请求体转换成 JSON 格式或其他对象类型,再使用字符串的形式进行加密操作。以下是伪代码示例,展示了这一过程的实现方法:

java 复制代码
String payloadString = ModelOptionsUtils.toJsonString(payload);
String hashedRequestPayload = sha256Hex(payloadString);
//将hashedRequestPayload封装到jsonContentHeaders中,并添加到请求头中
ResponseEntity<String> retrieve = this.restClient.post().uri("/").headers(headers -> {
    headers.addAll(jsonContentHeaders);
}).body(chatRequest).retrieve().toEntity(String.class);

这种方法看起来有些繁琐,而且如果在转换过程中与实际请求的结构不一致,可能会导致加密失败。关键问题在于 ModelOptionsUtils.toJsonString(payload); 这一过程,它与 restClient 中对象转化的方式并不完全一致。如果在转化时出现任何问题,我们不仅难以复现错误,还可能会面临很难排查的问题。理想的情况是,如果我们能够准确了解请求体在加密前最终的转换结果,那将大大简化排查过程并提高加密的可靠性。

所以今天我们就以拦截器的形式加密一下,保证与真实上传的请求体保持一致。

拦截器

今天简单介绍一下请求类 RestClient。其实,它和我们之前使用的 HttpUtils 功能上是类似的,但相较于 HttpUtils,RestClient 在可操作性和灵活性方面做了很多优化,能够提供更加丰富的功能和更高效的操作体验。特别是今天我们要重点介绍的拦截器功能,它可以让我们更加便捷地处理请求和响应的相关逻辑。接下来,我们就通过一个示例来详细了解这个过滤器的使用。

java 复制代码
ApiAuthHttpRequestInterceptor apiAuthHttpRequestInterceptor = new ApiAuthHttpRequestInterceptor();
this.restClient = RestClient.Builder.baseUrl(baseUrl)
        .defaultHeaders(jsonContentHeaders)
        .defaultStatusHandler(responseErrorHandler)
        .requestInterceptor(apiAuthHttpRequestInterceptor)
        .build();

我们在具体看下ApiAuthHttpRequestInterceptor类是如何实现的。

java 复制代码
public class ApiAuthHttpRequestInterceptor implements ClientHttpRequestInterceptor {
    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        String hashedRequestPayload = sha256Hex(payloadString);
        //将hashedRequestPayload封装到jsonContentHeaders中,并添加到请求头中
        request.getHeaders().putAll(httpHeadersConsumer);
      ClientHttpResponse response = execution.execute(request, body);
      return response;
    }
}

这一步的伪代码非常简洁明了,主要是因为我们能够直接获取到需要发送的请求体,因此无需再进行复杂的对象转换或序列化处理,避免了中间环节可能带来的不必要错误或数据变动。

内部原理

这里面的原理也很简单,核心思想就是对我们所注入的每个拦截器进行逐一遍历,并按照预定的逻辑依次执行我们重写的相关方法。通过这样的方式,可以在不改变原有逻辑的基础上,实现灵活的扩展与控制。具体的流程和实现细节如下图所示:

这里就是一个递归的过程,全部完成之后就可以正常去请求了。

总结

通过今天的分享,我们探讨了如何在请求中实现加密操作,并通过拦截器优化了加密过程。在传统方法中,依赖对象转换和序列化处理,容易导致加密不一致或难以调试的问题。通过引入拦截器,我们能够直接操作请求体,避免了不必要的转换步骤,确保加密过程与请求体完全一致,从而提高了加密的可靠性和调试的便捷性。希望这种方法对大家在加密需求的实现上有所帮助!


我是努力的小雨,一个正经的 Java 东北服务端开发,整天琢磨着 AI 技术这块儿的奥秘。特爱跟人交流技术,喜欢把自己的心得和大家分享。还当上了腾讯云创作之星,阿里云专家博主,华为云云享专家,掘金优秀作者。各种征文、开源比赛的牌子也拿了。

💡 想把我在技术路上走过的弯路和经验全都分享出来,给你们的学习和成长带来点启发,帮一把。

🌟 欢迎关注努力的小雨,咱一块儿进步!🌟

相关推荐
天竺鼠不该去劝架40 分钟前
2026 AI 智能体流程自动化平台选型|6 大评估维度 + 厂商横向对比
经验分享
三垣网安5 小时前
漏洞实战|高校虚拟实验平台报错型 SQL 注入漏洞复现
网络·经验分享·sql·安全·web安全·网络安全·水平越权
1314lay_10078 小时前
ABAP 读取服务器的文件 OPEN DATASET,READ DATASET f_filepath INTO l_file.
经验分享·笔记
杨逢昌工厂6S管理9 小时前
127-钣金产线6S改善后总反弹?杨逢昌一线现场诊断笔记:反弹背后的熵增机理与基准化治理
经验分享·笔记·职场和发展·学习方法
迪康Defender10 小时前
端点安全选型观察:一体化平台与传统 EDR 的场景差异
运维·经验分享·安全·自动化·学习方法·远程工作·安全架构
上海广测检测科技有限公司13 小时前
笔记本电脑VCCI注册解析:Class A/B选择、测试状态与技适的边界
经验分享
狮子座的男孩13 小时前
html+css基础:24、2D变换(位移/缩放/旋转/扭曲(了解)/多重变换/变换原点)
前端·css·经验分享·html·2d位移·原点变换·缩放/旋转/扭曲
光视界1 天前
友思特 ALE系列技术参数详解:UV波段的真实性能表现
经验分享·紫外光源
底层玩家老张1 天前
45:1压缩、19.1倍查询:1956亿行时序数据复盘
数据库·经验分享·时序数据库·存储压缩·写入优化
小矮强1 天前
输入凭证也没用?Windows 共享文件夹“来宾访问被安全策略阻止”
windows·经验分享