前提
之前写过一篇文章:https://qa-lsq.blog.csdn.net/article/details/119782694
只是简单尝试了一下生成一个随机手机号码。
但是如果在工作中一个实际场景要用的二次开发,可能会遇到一些问题。
比如这样一个场景:
Mobile或者前端调用部分接口,比如登录,验证码发送等等,要求手机号,密码,验证码等信息需要加密。
在调用接口时的值是经过加密的值,后端收到相应的信息后再解密。
这就使得在使用jmeter调用接口的时候,需要先把手机号,密码等值在其他地方加密一下,然后再填到jmeter里去,非常麻烦。
Jmeter二次开发就能完美的解决这个问题。
问题1
但在实际操作过程中遇到了一些问题。
首先讲一下环境,公司提供的电脑权限是限制的很死的,我没有权限修改环境变量。
同时java JDK的版本是17,IDEA只能下载社区版。
这就导致一个问题,使用社区版的IDEA创建Maven项目,然后打jar包,一切的做法都是对的,但偏偏打出来的jar包Jmeter无法读取。
原因是创建的maven项目中,pom.xml文件少了如下这段:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>7</source>
<target>7</target>
</configuration>
</plugin>
</plugins>
</build>
如果少了这段,maven未必能正确支持j你的java版本,打出来的jar包jmeter识别不了。
这边还有一个问题,
<source>7</source>
<target>7</target>
这边我填的是7,不是17
因为经过确定的尝试,填17打出来的jar包jmeter也无法识别,需要填写低版本
我推测是因为我使用的jmeter版本较低的原因,与高版本的java JDK不兼容。
问题2
我之前尝试的是生成随机手机号码,这个函数非常简单,不需要特别的jar包支持。
仅需二次开发所必须的一些jar包,如下:
这些jar包在下载好的meter里都会自带的。
但如果我要实现其他的功能,需要另外的jar包支持呢。
我贴一下此次二开的加密代码,密钥用XXXXXXXXX替换:
package org.examples.functions;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.symmetric.AES;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.functions.AbstractFunction;
import org.apache.jmeter.functions.Function;
import org.apache.jmeter.functions.InvalidVariableException;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.util.JMeterUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.Security;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
public class EcbEncryFunctionsAA extends AbstractFunction {
//密钥
private static final String ACE_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXX";
private static final String key = "__ecbEncryptfunctions";
private static final List<String> desc = new LinkedList<String>();
private static String middleString = "";
static{
desc.add(JMeterUtils.getResString("Name of encrypt String using ECB"));
}
// public static void main(String[] args) {
// System.out.println(aesEncryptPKCS7Padding("13944566740"));
// }
@Override
public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
Security.addProvider(new BouncyCastleProvider());
// String ecb_key = ACE_KEY;
String padding="PKCS7Padding";
AES aes = new AES(Mode.ECB.name(),padding, ACE_KEY.getBytes());
// 加密并进行Base转码
String encrypt = aes.encryptBase64(middleString);
return encrypt;
}
@Override
public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
if (collection.size() != 1) {
throw new InvalidVariableException("Expected 1 parameter, but got " + collection.size());
}
CompoundVariable parameter = collection.iterator().next();
middleString = parameter.execute();
}
// private static String aesEncryptPKCS7Padding(String text) {
// Security.addProvider(new BouncyCastleProvider());
// String ecb_key = ACE_KEY;
// String padding="PKCS7Padding";
// AES aes = new AES(Mode.ECB.name(),padding, ecb_key.getBytes());
加密并进行Base转码
// String encrypt = aes.encryptBase64(text);
// return encrypt;
// }
@Override
public String getReferenceKey() {
return key;
}
@Override
public List<String> getArgumentDesc() {
return desc;
}
}
这段加密需要两个jar包支持
经过测试,这段加密代码可用,而且打包之后可以在jmeter的函数助手里看见这个函数
但是在实际调用这个函数的时候jmeter会报错:
意思是没有相应的jar包支持
这边需要把所有依赖的jar包同样放到lib/ext/下
这边需要把所有依赖的jar包同样放到lib/ext/下
这边需要把所有依赖的jar包同样放到lib/ext/下
maven下载的jar包在.m2文件下,这边不多解释
解决这些问题之后,我的加密就可以在jmeter里使用了