很多时候,我们都要对request 和response 进行加解密,这时候就需要对Http 重定向,自定义拦截器,将请求和返回值进行拦截,处理后在发送或者解析。下面会分为java 和kotlin 版本。
加密会分为 get 的参数加密 、post 的body 加密,加密的方式大部分都是使用RSA 加密。
直接看代码吧。
java版
public class DataEncryptInterceptor implements Interceptor {
private static final String TAG = DataEncryptInterceptor.class.getSimpleName();
@Override
public Response intercept(@NonNull Chain chain) throws IOException {
Request request = chain.request();
Request.Builder requestBuilder = request.newBuilder();
String requestMethod = request.method().toLowerCase().trim();
HttpUrl url = request.url();
//协议地址
String scheme = url.scheme();// http https
//域名
String host = url.host();// 127.0.0.1
//接口名
String path = url.encodedPath();// /test/upload/img
String key = PrefsUtil.getInstance().getString(Constants.PUBLIC_KEY, "");
//判断是否需要加密,如果次路径不需要加密,则返回原始request即可
if (path.isEmpty() || (!path.contains(ApiAddress.CHECK_ROOM_SECRET_OUT) && !path.contains(ApiAddress.CHECK_ENCRYPTION)) || TextUtils.isEmpty(key)) {
return chain.proceed(request);
}
//判断是get 还是post(get 和 delete 是一样的请求方式)
if (requestMethod.equals("get") || requestMethod.equals("delete")) {
if (url.encodedQuery() != null) {
try {
String queryparamNames = request.url().encodedQuery();
//如果参数是空,则不加密
if (queryparamNames == null || TextUtils.isEmpty(queryparamNames)) {
//构建新的请求
String newUrl = scheme + ":" + host + path;
request = request.newBuilder().url(newUrl).build();
} else {
//对参数进行RSA加密后 ,构建新请求
String newParams = RSAUtils.encrypt(queryparamNames, key);
//构建新的请求
String newUrl = scheme + ":" + host + path + "?" + newParams;
request = request.newBuilder().url(newUrl).build();
}
} catch (Exception e) {
e.printStackTrace();
return chain.proceed(request);
}
}
} else {
//post 请求
try {
//获取body 中内容
RequestBody oldRequestBody = request.body();
Buffer requestBuffer = new Buffer();
oldRequestBody.writeTo(requestBuffer);
String oldBodyStr = requestBuffer.readUtf8();
requestBuffer.close();
//fromBody 加密
if (request.body() instanceof FormBody) {
//随机AES密钥加密oldBodyStr
String encrypt = RSAUtils.encrypt(oldBodyStr, key);
Log.e(TAG, "the encrypt is" + encrypt);
MediaType mediaType = MediaType.parse("text/plain; charset=utf-8");
RequestBody newBody = RequestBody.create(mediaType, encrypt);
request = request.newBuilder()
.

该文介绍了如何在Java和Kotlin中创建一个Interceptor来处理HTTP请求和响应的加解密。主要使用RSA算法,针对GET参数和POST的请求体进行加密,并在接收到200响应时解密响应内容。代码示例展示了如何在请求和响应链中插入拦截器进行处理。
最低0.47元/天 解锁文章
1573





