package com.lzy.okhttpdemo.callback;
import com.lzy.okhttpdemo.utils.MD5Utils;
import com.lzy.okhttputils.model.HttpParams;
import com.lzy.okhttputils.request.BaseRequest;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.TreeMap;
/**
* ================================================
* 作 者:jeasonlzy(廖子尧)
* 版 本:1.0
* 创建日期:2016/4/8
* 描 述:我的Github地址 https://github.com/jeasonlzy0216
* 修订历史:该类主要用于对所有的网络请求进行加密,防止拦截数据包进行篡改
* ================================================
*/
public abstract class EncryptCallback<T> extends CommonCallback<T> {
private static final Random RANDOM = new Random();
private static final String CHARS = "0123456789abcdefghijklmnopqrstuvwxyz";
@Override
public void onBefore(BaseRequest request) {
super.onBefore(request);
//以下是示例加密代码,根据自己的业务需求和服务器的配合,算法自行决定
sign(request.getParams());
}
/**
* 针对URL进行签名,关于这几个参数的作用,详细请看
* http://www.cnblogs.com/bestzrz/archive/2011/09/03/2164620.html
*/
private void sign(HttpParams params) {
params.put("nonce", getRndStr(6 + RANDOM.nextInt(8)));
params.put("timestamp", "" + (System.currentTimeMillis() / 1000L));
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, List<String>> entry : getSortedMapByKey(params.urlParamsMap).entrySet()) {
sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
sb.delete(sb.length() - 1, sb.length());
String sign = MD5Utils.encode(sb.toString());
params.put("sign", sign);
}
/** 获取随机数 */
private String getRndStr(int length) {
StringBuilder sb = new StringBuilder();
char ch;
for (int i = 0; i < length; i++) {
ch = CHARS.charAt(RANDOM.nextInt(CHARS.length()));
sb.append(ch);
}
return sb.toString();
}
/** 按照key的自然顺序进行排序,并返回 */
private Map<String, List<String>> getSortedMapByKey(Map<String, List<String>> map) {
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String lhs, String rhs) {
return lhs.compareTo(rhs);
}
};
TreeMap<String, List<String>> treeMap = new TreeMap<>(comparator);
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
treeMap.put(entry.getKey(), entry.getValue());
}
return treeMap;
}
}