最近在做后台数据加密,然后遇到这样一个问题,服务器的数据全部用加密算法加密了,发现无法使用“com.squareup.retrofit2:converter-gson:2.1.0”Jar包了。

自定义ConverterFactory

现在安卓流行Retrofit+Okhttp+Converter-gson,不过如果数据如果加密了,使用Converter-gson进行解析的时候会出现问题。字符串被加密了,自然不能直接使用Gson进行解析,这样我们就需要自己写一个Converter架包了。

其中Retrofit.Builder中有一个addConverterFactory,我们最后要将自己的ConverterFactory作为参数写入,通过这个ConverterFactory接口,实现我们自己的解析类即可。

//添加ConverterFactory
Retrofit client = new Retrofit.Builder() .addConverterFactory(ConverterAesJsonFactory.create())

ConverterFactory

要实现这个ConverterFactory需要写着三部分代码:

public class ConverterAesJsonFactory extends Converter.Factory {
private final Gson gson;
public static ConverterAesJsonFactory create() {
return create(new Gson());
} public static ConverterAesJsonFactory create(Gson gson) {
return new ConverterAesJsonFactory(gson);
} private ConverterAesJsonFactory(Gson gson) {
if (gson == null) throw new NullPointerException("gson == null");
this.gson = gson;
} @Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type,
Annotation[] annotations,
Retrofit retrofit) {
TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
return new AesGsonResponseBodyConverter(gson, adapter);
} @Override
public Converter<?, RequestBody> requestBodyConverter(Type type,
Annotation[] parameterAnnotations,
Annotation[] methodAnnotations,
Retrofit retrofit) {
TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
return new AesJsonRequestBodyConverter<>(gson, adapter);
}
}

ResponseBodyConverter

这个类也就是要进行解密操作的那个类了,除了解密算法,还有Json解析的代码。

/**
* 响应体
* Created by ChenSS on 2016/12/26.
*/
final class AesGsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
private final Gson gson;
private final TypeAdapter<T> adapter; AesGsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) {
this.gson = gson;
this.adapter = adapter;
} @Override
public T convert(ResponseBody responseBody) throws IOException {
try {
// TODO: 2016/12/26 设计你自己的响应体解密算法,下面使用了Base64解码
String decodeBody = Base64.decode(responseBody.string());
//Base64解码就上面一行,大家可以自行设计算法
Log.e("AesJsonFactory:", decodeBody);
JsonReader jsonReader = gson.newJsonReader(new StringReader(decodeBody));
try {
return adapter.read(jsonReader);
} finally {
responseBody.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

RequestBodyConverter

请求体操作,如果相对请求体进行操作就在这里写吧,不过我没有这个需求

/**
* 请求体
* Created by ChenSS on 2016/12/26.
*/
final class AesJsonRequestBodyConverter<T> implements Converter<T, RequestBody> {
private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
private static final Charset UTF_8 = Charset.forName("UTF-8"); private final Gson gson;
private final TypeAdapter<T> adapter; AesJsonRequestBodyConverter(Gson gson, TypeAdapter<T> adapter) {
this.gson = gson;
this.adapter = adapter;
} @Override public RequestBody convert(T value) throws IOException {
Buffer buffer = new Buffer();
Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);
JsonWriter jsonWriter = gson.newJsonWriter(writer);
// TODO: 2016/12/26 网络请求,这里我没修改,这和Converter-gson是一样的
adapter.write(jsonWriter, value);
jsonWriter.close();
return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
}
}

加密代理和Retrofit解密Converter的更多相关文章

  1. JDK动态代理和CGLIB的区别

    Aspect默认情况下不用实现接口,但对于目标对象,在默认情况下必须实现接口 如果没有实现接口必须引入CGLIB库 我们可以通过Advice中添加一个JoinPoint参数,这个值会由spring自动 ...

  2. JDK动态代理和CGLib动态代理简单演示

    JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...

  3. RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

  4. 在IOS中使用DES算法对Sqlite数据库进行内容加密存储并读取解密

    在IOS中使用DES算法对Sqlite 数据库进行内容加密存储并读取解密 涉及知识点: 1.DES加密算法: 2.OC对Sqlite数据库的读写: 3.IOS APP文件存储的两种方式及读取方式. 以 ...

  5. 总结两种动态代理jdk代理和cglib代理

    动态代理 上篇文章讲了什么是代理模式,为什么用代理模式,从静态代理过渡到动态代理. 这里再简单总结一下 什么是代理模式,给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原 ...

  6. AES加密解密——AES在JavaWeb项目中前台JS加密,后台Java解密的使用

    一:前言 在软件开发中,经常要对数据进行传输,数据在传输的过程中可能被拦截,被监听,所以在传输数据的时候使用数据的原始内容进行传输的话,安全隐患是非常大的.因此就要对需要传输的数据进行在客户端进行加密 ...

  7. SpringAOP-JDK 动态代理和 CGLIB 代理

    在 Spring 中 AOP 代理使用 JDK 动态代理和 CGLIB 代理来实现,默认如果目标对象是接口,则使用 JDK 动态代理,否则使用 CGLIB 来生成代理类. 1.JDK 动态代理 那么接 ...

  8. 通过一个工具类更深入理解动态代理和Threadlocal

    动态代理和Threadlocal 一个代理类返回指定的接口,将方法调用指定的调用处理程序的代理类的实例.返回的是一个代理类,由指定的类装载器的定义和实现指定接口指定代理实例调用处理程序最近用到一个工具 ...

  9. 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。

    基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...

随机推荐

  1. win10 uwp 自定义控件 SplitViewItem

    本文主要是因为汉堡菜单里面列出的菜单很多重复的图标和文字,我把它作为控件,因为是随便写,可能存在错误,如果发现了,请和我说或关掉浏览器,请不要发不良言论. 我们使用汉堡菜单,经常需要一个 需要一个图标 ...

  2. 简说chart2.4的应用,以及Uncaught ReferenceError : require is not defined的解决

    51呢最近在学习chart.js,然后呢就照着中文的帮助文档来然后就一直出Uncaught ReferenceError : require is not defined的问题查了挺多才知道是帮助文档 ...

  3. hdu 1018 共同交流~

    Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  4. centos7安装shipyard没有本地容器及镜像

    目前docker的使用越来越多,自然需要docker的管理工具.现在使用web管理的较多,web基本上实现了跨平台,只需要浏览器,不要额外的管理客户端.web管理主要推荐shipyard和kubern ...

  5. “华尔街之狼”:ICO是“史上最大骗局”

    勘探船进村的那个夏季,父亲从城里带回了那把手电.手电的金属外壳镀了镍,看上去和摸起来一样冰凉.父亲进城以前采了两筐枸杞子,他用它们换回了那把锃亮的东西.父亲一个人哼着<十八摸>上路,鲜红透 ...

  6. JQuery-基础学习1

    1)JQuery语法 jquery语法是为HTML元素的选取编制,可以对元素执行某些操作. 基础语法是:$(selector).action() 美元符号定义JQuery 选择符(selector)& ...

  7. C#,COM口,接收,发送数据

    这里写一种,COM口的数据接收,发送方法. 1.COMHelper类 /// <summary>初始化串行端口</summary> private SerialPort _se ...

  8. ssm框架的整合

    首先创建一个web工程,我这里使用的IDE为eclipse. 结果目录如下: 添加相关的jar包: 接下来是完成配置文件 首先我们先配置web.xml: <?xml version=" ...

  9. JavaScript数组去重方法汇总

    1.运用数组的特性 1.遍历数组,也遍历辅助数组,找出两个数组中是否有相同的项,若有则break,没有的话就push进去. //第一版本数组去重 function unique(arr){ var r ...

  10. Lua中metatable和__index的联系

    Lua中metatable和__index的联系 可以参考 http://blog.csdn.net/xenyinzen/article/details/3536708 来源 http://blog. ...