jmeter通过getArguments获取参数加密后设置成变量不生效问题?

起因:需要通过beanshell前置处理器对请求的参数进行加密处理,加密结果赋值给sign字段,通过vars.put("sign",md5_values)赋值给变量时,原本的想法是已经通过put赋值了变量,在请求中应该可以直接使用变量{{sign}}了,但是多次尝试后,却发现不生效,没有获取到想要的值。

问题原因:在通过Arguments args = sampler.getArguments()去获取参数时,实际上请求参数已经执行过变量替换操作了,所以此时在beanshell前置处理器中再使用vars.put去修改变量的值是不生效的。

解决方案:通过Argument 的setValue方法去修改参数值。

1、JSON格式的处理方式:

Arguments args = sampler.getArguments();
Argument arg_body = args.getArgument(0);   
String body = arg_body.getValue();  //获取请求body
JsonObject jsonObject=new  JsonParser().parse(body).getAsJsonObject();
Sign signa=new Sign();  //初始化签名方法
log.info("json_data-->{}",body);
String APPKEY=vars.get("APPKEY");
log.info("APPKEY-->{}",APPKEY);  //签名的Key值
String sign_str="";
sign_str=signa.signWMS(body,APPKEY).toString();  //调用签名方法生成签名字符串
log.info("sign-->{}",sign_str);
jsonObject.addProperty("signature",sign_str);   //给签名字符串赋值
arg_body.setValue(jsonObject.toString());       //重要:将修改后的内容重新设置回body中

2、Form格式的处理方式:

//获取请求的Body参数
Arguments args = sampler.getArguments();
String params="";
Argument arg_sign=new Argument();
//json格式请求:body只有一个key为空的参数值
for(int i=0;i<args.getArgumentCount();i++){  //循环去获取每一个值,进行修改或者替换
  Argument arg=args.getArgument(i);
     String key = args.getArgument(i).getName()+"";
     String value = args.getArgument(i).getValue()+"";
     log.info("key-->{}",key);
     if(key.equals("password")){
       log.info("password_pre-->{}",vars.get("password"));
       value=ju.MD5(vars.get("password"));
       log.info("value--->{}",value);
       vars.put("password2",value);
       arg.setValue(value);//修改参数的值
     }
     if(key.equals("sign")){
       //获取到sign元素,但是不做处理
       arg_sign=args.getArgument(i);
        continue;
       }
     if(i==args.getArgumentCount()-1){
         params=params+key+"="+value;
     }else{
        params=params+key+"="+value+"&";
      }
  log.info("requst body:key={},value={}",key,value);

 }
 vars.put("password2",ju.MD5(vars.get("password")));
log.info("----bbb---{}",params);
String key=vars.get("APPKEY");//获取密钥,在用户参数中设置。
log.info("--APPKEY->{}",key);

String  sign=ju.signCodeKey_String(params,key);
arg_sign.setValue(sign);     //重点:重新赋值
vars.put("sign",sign);
log.info("--sign-{}",vars.get("sign"));



我的回答