• jmeter压测学习36-请求body自动签名带上sign参数


    前言

    接口请求body带有sign签名参数,sign签名是根据请求body除去sign本身参数后,拼接请求参数最后md5加密生成的。
    使用 jmeter 测试接口,我们希望在请求之前修改 post body 里面的 sign 参数的值为签名的值。

    sign签名

    签名一篇的实现方式是添加 BeanShell 预处理程序,生成sign值,设置一个变量,然后在请求的body里面引用变量。

    可以参考前面这篇https://www.cnblogs.com/yoyoketang/p/14229289.html
    接下来再讲另外一种实现方式,在BeanShell 预处理程序先获取请求的body,签名后给sign参数重新赋值,然后发送新的请求body,整体实现思路如下
    1.先获取请求body值
    2.body转JSONObject对象
    3.根据sign签名规则,对JSONObject对象遍历取值,然后排序
    4.排序后拼接签名key,生成一个新的字符串
    5.md5加密,得到sign签名值
    6.给jsonObject对象添加sign属性
    7.JSONObject 转json字符串
    8.给请求的body重新赋值

    在发送请求之前添加上面功能的预处理,就可以实现body参数自动签名了

    BeanShell 预处理程序

    HTTP请求样本在body里面可以不用加签名sign参数

    添加 BeanShell 预处理程序

    整体代码实现如下

    import org.apache.jmeter.config.Arguments;
    import org.apache.jmeter.config.Argument;
    import org.json.JSONObject;
    import org.json.JSONArray;
    import org.apache.commons.codec.digest.DigestUtils;    //导入md5加密的包
    // 作者-上海悠悠 QQ交流群:717225969
    // blog地址 https://www.cnblogs.com/yoyoketang/
    
    Arguments arguments =  sampler.getArguments();
    Argument arg = arguments.getArgument(0);
    //  1.获取请求body值
    String body = arg.getValue();
    log.info(body);
    
    // 2.body转json对象
    JSONObject jsonObject = new JSONObject(body);
    String user = jsonObject.getString("username");
    String psw = jsonObject.getString("password");
    log.info(user);
    
    //3.获取到的json对象去除sign本身参数,拼接参数,排序,拼接key
    // 这段暂时还不会用java代码全自动实现
    String a = "username" + user;  
    log.info(a);
    String b = "password" + psw;
    log.info(b);
    String key = "12345678";
    log.info(key);
    
    // 4.排序后拼接签名key字符串
    c = b+a+key;
    log.info(c);
    
    // 5.md5加密,得到sign签名值
    String md5_after = DigestUtils.md5Hex(c);   // md5加密
    log.info(md5_after);
    
    
    // 6.给jsonObject对象添加sign参数
    jsonObject.put("sign", md5_after);
    
    // 7.JSONObject 转字符串
    String  postData = jsonObject.toString();
    log.info(postData);
    
    // 8.重新赋值请求的body参数
    arg.setValue(postData);
    

    运行后的部分日志

    2021-01-04 22:31:15,783 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
    2021-01-04 22:31:15,786 INFO o.a.j.u.BeanShellTestElement: {"username": "test", 
    "password": "123456", 
    "mail": ""}
    2021-01-04 22:31:15,788 INFO o.a.j.u.BeanShellTestElement: test
    2021-01-04 22:31:15,788 INFO o.a.j.u.BeanShellTestElement: usernametest
    2021-01-04 22:31:15,788 INFO o.a.j.u.BeanShellTestElement: password123456
    2021-01-04 22:31:15,789 INFO o.a.j.u.BeanShellTestElement: 12345678
    2021-01-04 22:31:15,790 INFO o.a.j.u.BeanShellTestElement: password123456usernametest12345678
    2021-01-04 22:31:15,791 INFO o.a.j.u.BeanShellTestElement: 1aca01806e93bb408041965a817666af
    2021-01-04 22:31:15,791 INFO o.a.j.u.BeanShellTestElement: {"password":"123456","mail":"","sign":"1aca01806e93bb408041965a817666af","username":"test"}
    2021-01-04 22:31:15,929 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
    

    查看结果树

    查看结果树运行结果请求body会带上sign值

    响应结果是成功的

  • 相关阅读:
    nopCommerce中缓存学习
    EF
    路由
    webapi的加密方式
    生成N位数字随机数
    C# DataTable 转 实体类
    WebBrowser 打印
    文件上传控件,格式统一
    sqlserver 表循环-游标、表变量、临时表
    VB 老旧版本维护系列---迷之集合- dataTable
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/14232975.html
Copyright © 2020-2023  润新知