jmeter application/x-www-form-urlencoded 参数自动添加sign签名参数以及所有参数排序脚本
Posted On 2017年2月9日
jmeter application/x-www-form-urlencoded 参数自动添加sign签名参数以及所有参数排序脚本
此脚本为jsr223 beanshell类型的脚本。 具体使用请参见jmeter使用教程。
import java.util.TreeMap;
import java.util.Set;
import java.util.Iterator;
import java.util.Map;
import java.util.Arrays;
import java.security.MessageDigest;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.nio.charset.Charset;
long requestTime = System.currentTimeMillis();
// 原始请求参数定义
//key1=value1&key2=&key3=value3 key2 为空将不会被作为签名的字符串并被舍弃请求。 具体请参见接口文档。
// 此处会自动添加sign 参数,sign可以不填或者留空即可。
String originalparametersString = "a=b&c=d&y=z&requestTime="+requestTime+"&sign=&loanId=111774&remark=你好我要添加个备注";
String[] parameters = originalparametersString.split("&");
log.info(originalparametersString);
log.info(String.valueOf(parameters.length));
TreeMap SortedParametersWithoutSign = new TreeMap();
// 将参数按字母排序
for(int i = 0 ; i < parameters.length ; i ++){
String[] pandvalue = parameters[i].split("=");
log.info(String.valueOf(pandvalue.length));
if(pandvalue.length>1){
String[] values = Arrays.copyOfRange(pandvalue, 1, pandvalue.length);
log.info(String.valueOf(values.length));
log.info(values[0]);
if(!values[0].equals(""))
SortedParametersWithoutSign.put(pandvalue[0],values[0]);
}
else{
//SortedParametersWithoutSign.put(pandvalue[0],null);
}
}
// 根据排序后的参数,组装参数。
String requestParameters = "";
Set set = SortedParametersWithoutSign.entrySet();
Iterator iterator = set.iterator();
int iterationcount = 0;
while(iterator.hasNext()) {
Map.Entry mentry = (Map.Entry)iterator.next();
log.info("key: "+mentry.getKey()+" ---- value:"+ mentry.getValue() );
// if( mentry.getValue()[0].equals("Y") && !mentry.getKey().equals("sign") ){
if(iterationcount == 0)
requestParameters += mentry.getKey()+"="+mentry.getValue();
else requestParameters += "&"+mentry.getKey()+"="+mentry.getValue();
iterationcount++;
// }
}
log.info(requestParameters);
// 将组装的参数 得到md5 散列串
MessageDigest md = MessageDigest.getInstance("MD5");
Byte[] messageDigest = md.digest((requestParameters+"123456").getBytes(Charset.forName("UTF-8")));
//Byte[] messageDigest = md.digest(requestParameters.getBytes());
BigInteger number = new BigInteger(1, messageDigest);
String hashtext = number.toString(16);
// Now we need to zero pad it if you actually want the full 32 chars.
while (hashtext.length() < 32) {
hashtext = "0" + hashtext;
}
log.info(hashtext);
//String[] input = {"Y",""};
//input[1] = hashtext;
// 加入sign的参数,重新生成 请求的参数。
SortedParametersWithoutSign.put("sign",hashtext);
// 重新拿到最新的请求数据
requestParameters = "";
set = SortedParametersWithoutSign.entrySet();
iterator = set.iterator();
iterationcount = 0;
while(iterator.hasNext()) {
Map.Entry mentry = (Map.Entry)iterator.next();
log.info("key: "+mentry.getKey()+" ---- value:"+ mentry.getValue() );
// if( mentry.getValue()[0].equals("Y") ){
if(iterationcount == 0)
requestParameters += mentry.getKey()+"="+mentry.getValue();
else requestParameters += "&"+mentry.getKey()+"="+mentry.getValue();
iterationcount++;
// }
}
log.info(requestParameters);
vars.put("requestParameters",requestParameters);
此篇文章已被阅读4156 次