android 网络拦截器统一处理请求参数和返回值加解密实现

前言

项目中遇到参数加密和返回结果加密的业务
这里写一下实现 一来加深记忆 二来为以后参考铺垫

需求

项目在开发中涉及到 登陆 发验证码 认证 等前期准备接口
这些接口需要单独处理 比如不加密 或者有其他的业务需求

剩下的是登陆成功以后的业务需求接口 针对入参和返回值做了RSA AES加密
需求大概是这样 下面看下代码实现逻辑

实现

在网络框架的配置类里添加加密拦截器

 HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory();OkHttpClient.Builder mOkHttpBuilder = new OkHttpClient.Builder().connectTimeout(CONN_TIME_OUT, TimeUnit.SECONDS).readTimeout(READ_TIME_OUT, TimeUnit.SECONDS).writeTimeout(WRITE_TIME_OUT, TimeUnit.SECONDS).sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager).addInterceptor(new EncryptionInterceptor()) //加密拦截器 统一处理

解析

我的业务场景是 前期的 登陆 发验证码 认证 接口不需要做加密
所以我需要在加密拦截器前期做单独处理

 		 //认证接口不处理加密需求if (url.encodedPath().equals("xxx/auth")) {return chain.proceed(request);}//登陆和验证码都是get接口所以在这里统一拦截 if (method.equals("get") || method.equals("delete")) {return chain.proceed(request);}

处理完特殊业务场景 就剩统一的post接口 参数统一封装成body

 		 //请求接口请求参数String param = InterceptorUtils.bodyToString(request);//获取加密的keyString aesKey = Hawk.get(AppCode.AES_EKY);String encryptData = AESUtils.encrypt(param, aesKey);//拿到加密后的json字符串String json = new Gson().toJson(new JsonRequest(encryptData));RequestBody body = RequestBody.create(request.body().contentType(), json);request = request.newBuilder().post(body).build();Response response = chain.proceed(request);

下图是加密后的参入 统一用data作为加密key-valuekey用于后端解析
1
再来看一下返回值解密的代码实现 这里有2个点需要注意一下
对于后端返回的类型 无非是对象Object或者数组Array 2种情况 统一封装
先来看一下返回的加密格式

 {"code":20000,"data":"N1bBAjZ4m6PGGWJmu53PzSOcyjjUL0Jo3UITcEgmxYWcnBZSXKXRK81bS65JVoB8ouAuBLSSQvzVxHAc/pRbdUentgpppoe8wfhKvLuVu9LhVPK9y6I9/rf5nNm4h0+R62ubdUNINLsi6tl+j/Gn/gMPAzIoEFtVyQMQvHJ1sH4uh4as0Tnxu51aEknNc8Pm","errorId":"","message":"操作成功"}

2
上图中,data是我们的业务返回数据 它可能是Array也可能是Object
encryptData 加密字符串

	//说明是数组if (encryptData != null && encryptData.startsWith("[")) {JSONArray jsonArray = JSONArray.parseArray(encryptData);decryptObj.setData(jsonArray);} else if (encryptData != null && encryptData.startsWith("{")) {//说明是对象JSONObject jsonObject = JSONObject.parseObject(encryptData);decryptObj.setData(jsonObject);}

EncryptionInterceptor 实现

public class EncryptionInterceptor implements Interceptor {@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();okhttp3.HttpUrl url = request.url();String method = request.method().toLowerCase().trim();//认证接口不处理加密需求if (url.encodedPath().equals("/isp/app/worker/auth")) {return chain.proceed(request);}if (method.equals("get") || method.equals("delete")) {return chain.proceed(request);}//请求接口请求参数String param = InterceptorUtils.bodyToString(request);//获取加密的keyString aesKey = Hawk.get(AppCode.AES_EKY);String encryptData = AESUtils.encrypt(param, aesKey);//拿到加密后的json字符串String json = new Gson().toJson(new JsonRequest(encryptData));RequestBody body = RequestBody.create(request.body().contentType(), json);request = request.newBuilder().post(body).build();Response response = chain.proceed(request);return Decrypt(response);}/*** 返回值解密* @param response 返回值* @return response*/private Response Decrypt(Response response) {try {Response.Builder builder = response.newBuilder();Response clone = builder.build();//成功 判断是否等于200if (clone.code() != 200) {return response;}ResponseBody body = clone.body();if (body != null) {MediaType mediaType = body.contentType();if (mediaType != null) {if (InterceptorUtils.isText(mediaType)) {String aesKey = Hawk.get(AppCode.AES_EKY);BaseResult result = new Gson().fromJson(body.string(),BaseResult.class);String encryptData = AESUtils.decrypt(result.getData().toString(), aesKey);ALog.e("解密返回数据 ->" + encryptData);BaseResult decryptObj = new BaseResult();decryptObj.setCode(result.getCode());decryptObj.setErrorId(result.getErrorId());decryptObj.setMessage(result.getMessage());//说明是数组if (encryptData != null && encryptData.startsWith("[")) {JSONArray jsonArray = JSONArray.parseArray(encryptData);decryptObj.setData(jsonArray);} else if (encryptData != null && encryptData.startsWith("{")) {//说明是对象JSONObject jsonObject = JSONObject.parseObject(encryptData);decryptObj.setData(jsonObject);}String strJson = new Gson().toJson(decryptObj);body = ResponseBody.create(mediaType, strJson);return response.newBuilder().body(body).build();}}}} catch (Exception e) {ALog.e("解密错误:" + e.getMessage());}return response;}
}

有什么问题欢迎交流~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/447780.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

npm ERR! reason: certificate has expired(淘宝镜像过期)

npm ERR! request to https://registry.npm.taobao.org/yauzl/-/yauzl-2.4.1.tgz failed, reason: certificate has expired 今天在执行npm install命令时,报错百度了下是淘宝证书过期原因 解决方法一 执行下面两个命令再进行npm install即可 npm cache clean --…

在Python中处理HTTP代理的验证:一场与“门卫“的友好交流

各位魔法探险家们,今天我们要一起学习如何在Python中处理HTTP代理的验证,这可是一场与"门卫"的友好交流啊! 首先,我们要明白什么是HTTP代理的验证。简单来说,就像魔法世界的"门卫"一样&#xff0…

springBoot - mybatis 多数据源实现方案

应用场景: 多数据源 小型项目 或者 大项目的临时方案中比较常用.在日常开发中,可能我们需要查询多个数据库,但是数据库实例不同,导致不能通过 指定schema的方式 区分不同的库, 这种情况下就需要我们应用程序配置多数据源 实现方式: 首先自定义实现 datasource数据源 为当前…

【Django-ninja】分页管理器

django ninja通过paginate装饰器即可进行分页。内置了两个分页管理器LimitOffsetPagination和PageNumberPagination,能够实现基本的分页要求。当内置分页器不满足要求时,可以继承PaginationBase进行扩展自己的分页管理器。 1 使用分页器 from ninja.pa…

记录一次使用ant design 中 ConfigProvider来修改样式导致样式改变的问题(Tabs嵌套Tabs)

一 说明 继之前的一篇文章:antd5 Tabs 标签头的文本颜色和背景颜色修改 后,发现在被修改后的Tab中继续嵌套Tabs组件,这个新的Tabs组件样式跟外层Tabs样式也是一致的,如下图所示: 二 原因 在修改外层tabs样式时&…

AIGC领域又有大动作了!AI视频“黑马”Morph Studio 来袭,1080P高清画质视频免费生成!

起初小编也不知道 Morph Studio,也是从AIGC美少女、AI电影导演 海辛Hyacinth 口中知晓,因为她在2024年刚加入了 Morph Studio公司。 废话不多数,接下来小编则为大家介绍下 Morph Studio 这个初创公司开发了一个什么样的产品,而引起…

CHS_08.2.3.6_1+生产者-消费者问题

CHS_08.2.3.6_1生产者-消费者问题 问题描述问题分析思考:能否改变相邻P、V操作的顺序?知识回顾 在这个小节中 我们会学习一个经典的进程同步互斥的问题 问题描述 并且尝试用上个小节学习的p v操作 也就是信号量机制来解决这个生产者消费者问题 问题的描…

Codeforces Round 651 (Div. 2)C 博弈 奇偶数 偶数的表示

Submission #244500083 - Codeforces 题目: 思路: 此题要从奇偶性上入手。(注意除的是奇因数,即一个奇数。我想成质数了) 1.当A选手开局是1时,A败。 2.当A选手开局是2和奇数时,A必胜。&…

2024 美国大学生数学建模竞赛(F题)减少非法野生动物贸易 | 建模秘籍文章代码思路大全

铛铛!小秘籍来咯! 小秘籍团队独辟蹊径,以蒙特卡洛模拟、决策树、博弈论等强大工具,构建了解决复杂问题的独特方案。深度学习和Kano模型的妙用,为降低非法野生动物贸易提供新视角。通过综合分析,描绘出概率、…

Stable diffusion使用和操作流程

Stable Diffusion是一个文本到图像的潜在扩散模型,由CompVis、Stability AI和LAION的研究人员和工程师创建。它使用来自LAION-5B数据库子集的512x512图像进行训练。使用这个模型,可以生成包括人脸在内的任何图像,因为有开源的预训练模型,所以我们也可以在自己的机器上运行它…

在 Elastic Agent 中为 Logstash 输出配置 SSL/TLS

要将数据从 Elastic Agent 安全地发送到 Logstash,你需要配置传输层安全性 (TLS)。 使用 TLS 可确保你的 Elastic Agent 将加密数据发送到受信任的 Logstash 服务器,并且你的 Logstash 服务器从受信任的 Elastic Agent 客户端接收数据。 先决条件 确保你…

深掘开源安全需求,破解开源治理难题

当下,中国金融科技行业在数字支付、数字信贷、金融风控等领域取得了很多创新成果,大幅提升了金融数字化和智能化水平,已经在金融科技的全球竞争中走在前列。 在此进程中,开源技术发挥了不可或缺的重要作用,根据我国金…