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

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

ApiAuthHttpRequestInterceptor apiAuthHttpRequestInterceptor = new ApiAuthHttpRequestInterceptor();
this.restClient = RestClient.Builder.baseUrl(baseUrl)
.defaultHeaders(jsonContentHeaders)
.defaultStatusHandler(responseErrorHandler)
.requestInterceptor(apiAuthHttpRequestInterceptor)
.build();

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

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 技术这块儿的奥秘。特爱跟人交流技术,喜欢把自己的心得和大家分享。还当上了腾讯云创作之星,阿里云专家博主,华为云云享专家,掘金优秀作者。各种征文、开源比赛的牌子也拿了。

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

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

RestClient 通过拦截器实现请求加密的更多相关文章

  1. Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求

    Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 >>>>>>>>>>>>>>&g ...

  2. spring mvc 通过拦截器记录请求数据和响应数据

    spring mvc 能过拦截器记录请求数据记录有很多种方式,主要有以下三种: 1:过滤器 2:HandlerInterceptor拦截器 3:Aspect接口控制器 但是就我个人所知要记录返回的数据 ...

  3. springweb项目自定义拦截器修改请求报文头

    面向切面,法力无边,任何脏活累活,都可以从干干净净整齐划一的业务代码中抽出来,无非就是加一层,项目里两个步骤间可以被分层的设计渗透成筛子. 举个例子: 最近我们对接某银行接口,我们的web服务都是标准 ...

  4. Structs2 中拦截器获取请求参数

    前言 环境:window 10,JDK 1.7,Tomcat 7 测试代码 package com.szxy.interceptor; import java.util.Map; import jav ...

  5. vue 路由拦截器和请求拦截器

    路由拦截器 已路由为导向 router.beforeEach((to,from,next)=>{ if(to.path=='/login' || localStorage.getItem('to ...

  6. Apache httpclient拦截器对请求进行签名

    Apahce httpclient 提供HttpRequestInterceptor和HttpResponseInterceptor两种拦截器分别处理请求和响应数据,下面讲一下如何对http请求进行拦 ...

  7. 五、Vue:使用axios库进行get和post、用拦截器对请求和响应进行预处理、Mock(数据模拟)

    一.axios [应用]进行请求和传表单 [axios中文档]:https://www.kancloud.cn/yunye/axios/234845 [vue-axios]:https://cn.vu ...

  8. vue+axois 封装请求+拦截器(请求锁+统一错误)

     需求 封装常用请求 拦截器-请求锁 统一处理错误码 一.封装常用的请求 解决痛点:不要每一个模块的api都还要写get,post,patch请求方法.直接将这些常用的方法封装好. 解决方案:写一个类 ...

  9. 说说struts2中拦截器的请求流程一(模拟大致流程)

    本文可作为北京尚学堂struts2课程的学习笔记. 首先 什么是拦截器?拦截器能干什么? 拦截器,顾名思义就是拦截对象然后做操作的东西,至于是拦截谁?那自然是拦截action了.能做什么操作呢?你想让 ...

  10. java拦截器获取请求完整参数

    public class OptLogAspect implements HandlerInterceptor { @Override public boolean preHandle(HttpSer ...

随机推荐

  1. 想学习建个网站?WAMP Server助你在Windows上快速搭建PHP集成环境

    我想只要爬过几天网的同学都会知道PHP吧,异次元的新版本就是基于PHP的WordPress程序制造出来的,还有国内绝大部分论坛都是PHP的哦.据我所知很多同学都想要试着学习一下PHP,无奈要在Wind ...

  2. MySQL8.0安装与使用

    Windows: 1.下载:https://dev.mysql.com/downloads/mysql/ 推荐使用镜像:http://mirrors.sohu.com/mysql/MySQL-8.0/ ...

  3. StarBlog博客Vue前端开发笔记:(2)SASS与SCSS

    前言 本项目需要使用 SCSS 来编写页面样式. Sass (Syntactically Awesome Stylesheets)是一个 css 预处理器,而 SCSS 是 Sass 的一种语法格式, ...

  4. Redis应用—2.在列表数据里的应用

    大纲 1.基于数据库 + 缓存双写的分享贴功能 2.查询分享贴列表缓存时的延迟构建 3.分页列表惰性缓存方案如何节约内存 4.用户分享贴列表数据按页缓存实现精准过期控制 5.用户分享贴列表的分页缓存的 ...

  5. 你真的懂System.out.println()吗?

    简介 众所周知,Java语言是面向对象的,那如果让你用一行代码体现出来呢? 如果你能自己读懂System.out.println(),就真正了解了Java面向对象编程的含义. 面向对象编程即创建了对象 ...

  6. 使用 ayncio 实现 CountDownLatch

    class CountDownLatch(object): def __init__(self, count=1): self.count = count self.lock = asyncio.Lo ...

  7. 如何调整Gitlab-Runner最大并发数?

    概述: 我们在使用gitlab-runner做cicd时,如果安装之后没有配置gitlab-runner的最大并发数,在使用时候可能会碰到job的警告(job日志超过字节限制):job's log e ...

  8. Qt编写可视化大屏电子看板系统22-平滑曲线图

    一.前言 平滑曲线是所有涉及到曲线图的项目中,绕不开的一个话题,尽管很多人爱看折线图,但是很多时候来个平滑曲线图,会更加赏心悦目,这就好比现在的手机app移动客户端上,从最初的四方四正到现在的平滑圆角 ...

  9. CentOS安装tigerVNC Server

  10. 长连接网关技术专题(六):石墨文档单机50万WebSocket长连接架构实践

    本文由石墨文档技术杜旻翔分享,原题"石墨文档 Websocket 百万长连接技术实践",有修订. 1.引言 在石墨文档的部分业务中,例如文档分享.评论.幻灯片演示和文档表格跟随等场 ...