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);

        //获取加密的key
        String 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":"N1bBAjZ4m6PGGWJmu53PzSOcyjjUL0Jo3UITcEgmxY
    	    	WcnBZSXKXRK81bS65JVoB8ouAuBLSSQvzVxHAc
    			/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 {
    @Override
    public 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);

        //获取加密的key
        String 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();

            //成功 判断是否等于200
            if (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;
    }
}

有什么问题欢迎交流~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jsp游戏网上商城系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 游戏网上商城系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

flutter开发实战-Camera自定义相机拍照功能实现

flutter开发实战-Camera自定义相机拍照功能实现 一、前言 在项目中使用image_picker插件时候,在android设备上使用无法默认设置前置摄像头(暂时不清楚什么原因),由于项目默认需要使用前置摄像头,所以最终采用自定义…

机器学习 | 如何构建自己的决策树算法?

决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-else结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法 目录 初识决策树 决策树原理 cart剪枝 特征提取 泰坦尼克号乘客生存预测(实操) 回归决策树 初识决策树 决策树是一种…

分布式事务 seata+nacos 部署

分布式事务 seatanacos 部署 一、下载seata二、解压配置三、导入数据库四、nacos配置五、配置要引入事务的模块的配置文件六、启动七、测试 这里使用的版本: nacos:2.0.4 seata:1.5.2 seata官方地址:https://seata.apache.org/zh-…

【数据结构】并查集(路径压缩)

文章目录 并查集1.朴素版本2.路径压缩3.按秩合并4.启发式合并5.练习题 并查集 1.朴素版本 1. 并查集解决的是连通块的问题,常见操作有,判断两个元素是否在同一个连通块当中,两个非同一连通块的元素合并到一个连通块当中。 并查集和堆的结构…

零基础学Python(6)— 运算符

前言:Hello大家好,我是小哥谈。运算符是一种用于执行特定操作的符号或关键字。在编程中,运算符用于对变量、常量和表达式进行操作,以产生一个结果。下面将详细介绍Python语言中常见的运算符!~🌈 目录 &a…

Three.js学习2:页面引入 Three.js

一、关于 Three.js 的版本 随着页面3D化应用越来越多,近两年 Three.js 处于飞速发展之中。现在 Three.js 几乎每个月都会发布一个新的版本,会增加新的 API,废掉一些旧的功能之类的。 可以从 Three.js 官网 Three.js – JavaScript 3D Libra…

【Linux】线程安全——同步和互斥

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 引入1. Linux线程互斥1.1 互斥的相关概念1.2 互斥量mutex1.3 mutex的使用1.4 mutex的…

Windows11 用 HyperV 安装 Ubuntu-16.04 虚拟机

Windows11 用 HyperV 安装 Ubuntu-16.04 虚拟机 1. 确保已经开启HyperV2. 准备Ubuntu16.04镜像&#xff08;推荐64位的&#xff09;3. HyperV ->快速创建 -> 更改安装源 选刚刚下载的镜像&#xff08;.iso&#xff09;文件就好 -> 创建虚拟机[^1] 前提&#xff1a;VMw…

<网络安全>《15 移动安全管理系统》

1 概念 移动安全管理系统&#xff0c;MSM&#xff0c;Mobile security management,提供大而全的功能解决方案&#xff0c;覆盖了企业移动信息化中所涉及到安全沙箱、数据落地保护、威胁防护、设备管理、应用管理、文档管理、身份认证等各个维度。移动安全管理系统将设备管理和…

基于SpringBoot Vue单位考勤管理系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

MacOS安装JDK+Maven+Idea插件+nvm等

Java安装环境(MacOS)JDKMavenIdea插件nvm等 背景&#xff1a;新机安装开发环境发现需要找很多文章&#xff0c;&#xff0c;&#xff0c;&#xff0c;这里一篇文章安装所有环境 文章目录 Java安装环境(MacOS)JDKMavenIdea插件nvm等一、安装JDK①&#xff1a;下载②&#xff1a;…

opencv0014 索贝尔(sobel)算子

前面学习的滤波器主要是用来模糊图像&#xff0c;今天一起来了解关于边缘识别的滤波吧&#xff01;嘿嘿 边缘 边缘是像素值发生跃迁的位置&#xff0c;是图像的显著特征之一&#xff0c;在图像特征提取&#xff0c;对象检测&#xff0c;模式识别等方面都有重要的作用。 人眼如…

【牛B得一塌糊涂】窗口归一化技术,改进医学图像的分布外泛化能力

窗口归一化技术&#xff0c;改进医学图像的分布外泛化能力 提出背景WIN、WIN-WIN、无参数归一化、特征级别数据增强如何提升分布外的泛化&#xff1f; 总结子问题1: 医学图像中的局部特征表示不足子问题2: 训练数据与新场景数据分布不一致子问题3: 模型在分布外数据上泛化能力不…

docker 容器指定主机网段

docker 容器指定主机网段。 直接连接到物理网络&#xff1a;使用macvlan技术可以让Docker容器直接连接到物理网络&#xff0c;而不需要通过NAT或端口映射的方式来访问它们。可以提高网络性能和稳定性&#xff0c;同时也可以使容器更加透明和易于管理。 1、查询网卡的名称&…

C++初阶之类与对象(上)详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.前言 二.类的定义和使用 2.1类的引入 2.2类的定义和访问限定…

ubuntu22.04安装部署02:禁用显卡更新

一、查看可用显卡驱动 ubuntu-drivers devices 二、查看显卡信息 # -i表示不区分大小写 lspci | grep -i nvidia nvidia-smi 三、查看已安装显卡驱动 cat /proc/driver/nvidia/version 四、锁定显卡升级 使用cuda自带额显卡驱动&#xff0c;居然无法&#xff0c;找到如何锁…

构建LLM辅助生物威胁制造预警系统 人类越发展获取的超能力越大,破坏力越大,威胁越大。我们需要什么样的预警系统?既克服威胁又具有超能力 安全基础

https://openai.com/research/building-an-early-warning-system-for-llm-aided-biological-threat-creation 人类越发展获取的超能力越大&#xff0c;破坏力就越大&#xff0c;威胁越大。 人工智能就是为了赋予人人都能有超能力&#xff0c;而一旦被恶意或无意使用又威胁到人…

KNIME 节点之战(Game of Nodes)锦标赛

“Hark! I summon thee to a contest of nodes. Art thou endowed with the courage for the encounter?” “听着&#xff01;我在此邀请你加入一场节点之战。你有勇气面对吗&#xff1f;” 官方链接 活动概要与参赛守则 诚邀您加入 KNIME 节点之战 —— 首届全球工作流挑战大…

Megatron-LM源码系列(七):Distributed-Optimizer分布式优化器实现Part2

1. 使用入口 DistributedOptimizer类定义在megatron/optimizer/distrib_optimizer.py文件中。创建的入口是在megatron/optimizer/__init__.py文件中的get_megatron_optimizer函数中。根据传入的args.use_distributed_optimizer参数来判断是用DistributedOptimizer还是Float16O…