jmeter application/x-www-form-urlencoded 参数自动添加sign签名参数以及所有参数排序脚本

Life is short , play more!
本文来自lihao's Blog,转载请注明。

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);

 


发表评论

电子邮件地址不会被公开。 必填项已用*标注