讲解将Java类属性及值生成URL格式数据,按照ASCII码排序

原创     发表于 2020-10-17 12:33     阅读 101  

如果我们有需求需要将Java类的属性及值生成URL格式数据并且按照ASCII码排序,这种需求在项目中特别是和第三方系统进行对接的时候有使用场景。比如将所有的请求参数组合后生成签名,则需要签名之前对请求参数进行特定的排序,今天我们就来举例说明这种方法。

比如我们有一个类 EnterInfoParam.java,代码如下:

public class EnterInfoParam {

@ApiModelProperty(value = "请求编号,仅只能包含数字、字母")
@Length(min = 1, max = 40, message = "请求编号长度限制1-40位")
@IsAlphanumeric(message = "请求编号仅只能包含数字、字母")
private String requestNumber;
@ApiModelProperty(value = "服务ID")
@NotNull(message = "服务ID不能为空")
private BigInteger serviceId;
@ApiModelProperty(value = "进场时间")
@NotNull(message = "进场时间不能为空")
private Long enterTime;
@ApiModelProperty(value = "停车场ID")
@NotNull(message = "停车场ID不能为空")
private BigInteger parkingId;
// 省略get、set
}

我们需要将属性和值拼装成我们想要的URL格式数据,按照ASCII码排序,enterTime=1602909665&parkingId=1000&requestNumber=20101712152315977380014104&serviceId=2000,这样的URL格式字符串就是我们需要的。得到这样的数据步骤分解:

  1. 将Java bean 转为HashMap格式;
  2. 将HashMap的 key转为ArrayList集合;
  3. 对ArrayList进行排行
  4. 遍历ArrayList,依次根据元素获取HashMap中的value,进行拼装;
附上实现以上步骤的代码
/**
* 创建参数URL格式数据,按照ASCII码排序
* @param obj
* @return
*/
private static String createParamUrl(Object obj) {

Map<String, Object> params = BeanConvert.objConvertMap(obj);
//keySet获取键集
List<String> keys = new ArrayList<>(params.keySet());
//对键集进行排序
Collections.sort(keys);
StringBuffer sb = new StringBuffer();
for(int i = 0, j = keys.size();i < j;i++) {
String curKey = keys.get(i);
Object curValue = params.get(curKey);

// 如果是最后一个参数,则不加“&”
if(i== keys.size() - 1) {
sb.append(curKey + "=" + curValue);
} else {
sb.append(curKey + "=" + curValue + "&");
}

}
return sb.toString();
}


提供简单的签名校验方式,供参考

将排序的URL串生成Md5值  

使用Rsa公钥对 Md5值进行加密,得到签名值

将签名值放于HTTP请求header中,传递到目标服务

后端对接收到的参数生成URL串,并生成Md5值

从header中取出签名值,使用Rsa私钥解密,进行比对