前端使用JMeter测试JSEncrypt加密登录
简介:前端开发时会接触到用户登录,登录时为了数据的安全会使用到jsencrypt加密工具,同时我们需要使用jmeter来进行压测,帮助我们了解Web应用程序在高负载情况下的性能表现,从而为优化应用程序性能提供参考
环境:
1.JMeter: 5.5 2.JDK: 8.0 3.插件: 安装插件:jmeter-plugins-manager-1.3.jar ![在这里插入图片描述](https://img-blog.csdnimg.cn/38a5797452b54a15b4c081788776109d.png)
1.创建线程组
![在这里插入图片描述](https://img-blog.csdnimg.cn/cc6e6637a5a4477c87af54d001b6f4ca.png)
2. 创建HTTP信息头管理器
![在这里插入图片描述](https://img-blog.csdnimg.cn/f04cee99dc72477abbd8d2fb3c7b57a3.png)
Content-Type :application/json
3. 创建HTTP请求
3.1请求接口说明requestBody: loginType登录类型,phone登录的手机号,password加密后的密码
{
"loginType":0,
"phone":"${username}",
"password":"${rsa_pwd}"
}
4. 添加前置处理器
4.1 添加csv文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/c5978f12737f47bc806cc2c9bd01b42a.png)
4.2 添加JSR223预处理程序
4.2.1 获取公钥并保存
脚本:
// 导入必需的类
import org.apache.http.clienthods.HttpGet
import org.apache.http.impl.client.HttpClients
import org.apache.http.util.EntityUtils
// 创建一个 HTTPS 连接
def httpClient = HttpClients.createDefault()
// 创建一个 HTTP GET 请求
def httpRequest = new HttpGet("https://XXXXX.com/auth-server/oauth/publickey")
// 发送 HTTP GET 请求并获取响应
def httpResponse = httpClient.execute(httpRequest)
// 获取响应数据
def response = EntityUtils.toString(httpResponse.getEntity())
// 将响应数据保存到 JMeter 变量中
vars.put("response", response)
// 关闭连接
httpClient.close()
4.2.2 加密用户的密码
![在这里插入图片描述](https://img-blog.csdnimg.cn/adf690d9f2db47e5ba2863c959ba59c7.png)
var log = org.apache.logging.log4j.LogManager.getLogger();
var response = vars.get("response");
var navigator = this;
var window = this;
// 引用在线jsencrypt.min.js包,也可以下载到本地再引用
load("https://passport.cnblogs.com/scripts/jsencrypt.min.js");
log.info("==================================开始加密==============================");
// 获取公钥
var pubKey = JSON.parse(response).data;
log.info("公钥:"+pubKey);
// 使用JSEncrypt库对数据进行加密
var encrypt = new JSEncrypt();
encrypt.setPublicKey(pubKey);
// 用户名
var username = '${phone}';
log.info("用户名:"+username);
// 将用户名保存到 JMeter 变量中
vars.put("username", username)
// 获取密码
var password = '${password}';
log.info("密码:"+password);
// 获取当前时间戳
var currentTime = new Date().getTime();
log.info("当前时间戳:"+currentTime);
// 将密码和当前时间进行拼接
var data = password + "," + currentTime;
var rsa_pwd = encrypt.encrypt(data);
log.info("加密后数据:"+rsa_pwd);
// 将加密后数据保存到 JMeter 变量中
vars.put("rsa_pwd", rsa_pwd)
log.info("==================================结束加密==============================");
5. 添加-断言-JSON断言
![在这里插入图片描述](https://img-blog.csdnimg.cn/9b54313305bb429ead89d6ec60a0fd5f.png)
6.添加-后置处理器-JSON提取器
提取登录成功后,后端返回的token ![在这里插入图片描述](https://img-blog.csdnimg.cn/7a8798f9b71e469b83a404e2bccf41d4.png)
7.添加-监听器-察看结果树
![在这里插入图片描述](https://img-blog.csdnimg.cn/02617a50c3f248caa9019679075aa94b.png)
8.添加-监听器-聚合报告
![在这里插入图片描述](https://img-blog.csdnimg.cn/1b833364459247bcbf39bfe5d1471d9f.png)
9.开始测试
9.1接口响应结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/3ea473c172f842e78c2d027bde12420d.png)
9.2聚合报告:
补充:你也可以直接使用我配置好的jmx文件,在jmeter中直接打开即可:
false
true
false
false
saveConfig
true
true
true
true
true
true
true
true
true
false
true
true
false
false
false
true
false
false
false
true
0
true
true
true
true
true
true
false
saveConfig
true
true
true
true
true
true
true
true
true
false
true
true
false
false
false
true
false
false
false
true
0
true
true
true
true
true
true
false
saveConfig
true
true
true
true
true
true
true
true
true
false
true
true
false
false
false
true
false
false
false
true
0
true
true
true
true
true
true
1000
false
false
false
xxxxxx.com
CPU
xxxxxx.com
Memory
xxxxxx.com
Network I/O
continue
false
1
10
1
false
true
Content-Type
application/json
true
false
{
;loginType;:0,
;phone;:;${username};,
;password;:;${rsa_pwd};
}
=
xxxxxx.com
https
/auth-server/oauth/login
POST
true
false
true
false
,
UTF-8
C:/Users/chenhongxin/Desktop/20用户.csv
true
false
false
shareMode.all
true
phone,password
groovy
true
// 导入必需的类
import org.apache.http.clienthods.HttpGet
import org.apache.http.impl.client.HttpClients
import org.apache.http.util.EntityUtils
// 创建一个 HTTPS 连接
def httpClient = HttpClients.createDefault()
// 创建一个 HTTP GET 请求
def httpRequest = new HttpGet(;https://xxxxxx.com/auth-server/oauth/publickey;)
// 发送 HTTP GET 请求并获取响应
def httpResponse = httpClient.execute(httpRequest)
// 获取响应数据
def response = EntityUtils.toString(httpResponse.getEntity())
// 将响应数据保存到 JMeter 变量中
vars.put(;response;, response)
// 关闭连接
httpClient.close()
javascript
true
var log = org.apache.logging.log4j.LogManager.getLogger();
var response = vars.get(;response;);
var navigator = this;
var window = this;
// 引用在线jsencrypt.min.js包,也可以下载到本地再引用
load(;https://passport.cnblogs.com/scripts/jsencrypt.min.js;);
log.info(;==================================开始加密==============================;);
// 获取公钥
var pubKey = JSON.parse(response).data;
log.info(;公钥:;+pubKey);
// 使用JSEncrypt库对数据进行加密
var encrypt = new JSEncrypt();
encrypt.setPublicKey(pubKey);
// 用户名
var username = '${phone}';
log.info(;用户名:;+username);
// 将用户名保存到 JMeter 变量中
vars.put(;username;, username)
// 获取密码
var password = '${password}';
log.info(;密码:;+password);
// 获取当前时间戳
var currentTime = new Date().getTime();
log.info(;当前时间戳:;+currentTime);
// 将密码和当前时间进行拼接
var data = password + ;,; + currentTime;
var rsa_pwd = encrypt.encrypt(data);
log.info(;加密后数据:;+rsa_pwd);
// 将加密后数据保存到 JMeter 变量中
vars.put(;rsa_pwd;, rsa_pwd)
log.info(;==================================结束加密==============================;);
//
//
将加密后的密码和用户名添加到HTTP请求参数中
//vars.put(;rsa_pwd;, rsa_pwd);
//vars.put(;username;, username);
//
//
$.code
200
true
false
false
true
token
$.data.token
1
false
true
false
|