当当当~~~有小哥哥指出使用diget函数就可以实现。如果只是需要SHA256加密的可以直接使用函数助手diget。
这个当作Jmeter二次开发入门学习好了。
最近测试的注册、登录接口,密码通过SHA256加密,诸如以前的MD5加密可以直接使用Jmeter函数助手进行加密,SHA256加密没有现成的函数。
在网上搜索了大半天,基本两个路线,一个是通过Beanshell脚本,一个是对Jmeter进行二次开发,自行添加函数,之后使用函数助手进行调用。
效果:觉得写进函数助手是个一劳永逸的办法,于是开始根据网上搜寻的教程实践。然而,还是遇到了很多坑!!!!毕竟自己是个渣,别人过程一没写全,我就短路了。
实践完了之后发现,也不算难嘛。
很多事情都是这样,你做的时候觉得难度挺大,回头来看, 也就这点破事。
一、源码下载
Jmeter官网是提供源码下载的:http://jmeter.apache.org/download_jmeter.cgi
页面提供当前最新版本下载,历史版本点击下面:
选择source:
下载对应版本的源码的压缩包,然后解压。
二、IDE的选择
IDE,也就是集成开发环境,常见的就是myEclipse、eclipse、IDEA等。eclipse和IDEA的社区版都是免费的。
因为需要用到导出部分文件夹为jar包的格式,我在IDEA上找了好久都没找到这个功能,所以踩了一下午坑之后决定转用eclipse了。如果你们谁发现IDEA上的这个功能怎么操作的分享一下。
无脑走教程的就选eclipse。
下载:https://www.eclipse.org/downloads/
默认进去是win版的,需要mac或linux版的点"Download Packages"进入
三、导入源码
1.打开eclipse,这里是eclipse的workspace,简单说就是在eclipse中新建项目会默认存放在这个文件夹下
2.新建一个java project
写工程名:
勾选允许导出
3.导入源码
右键项目名-Import(忽略上面那个Jmeter,是自己练手做的)
选择你解压了Jmeter的目录:
导入后可以看到:
你导入之后应该会看到src的文件夹下有红色的小叉,是因为缺少依赖的jar包。(我是因为之前练手时已经添加了依赖包)
4.导入依赖包
一种方式是,把你可执行版(Binaries版)Jmeter里lib目录下的jar包都复制到源码的lib目录下。
另一种使用ant框架导入依赖包:
双击:download_jars
可以从控制台看到下载包的情况
下载jar结束后,项目右键-properties
把这两个文件改为.classpath和.project
可通过终端命令
mv eclipse.classpath .classpath
重启eclipse之后就不会再有红色叉了。
四、二次开发
在该目录下,新建一个class文件,SHA256.java
复制以下代码:
package org.apache.jmeter.functions;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.threads.JMeterVariables;
import org.apache.jmeter.util.JMeterUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/*
* 对字符串进行SHA256加密
*/
public class SHA256 extends AbstractFunction {
private static final Logger log = LoggerFactory.getLogger(SHA256.class);
private static final List<String> desc = new LinkedList<>();
private static final String KEY = "__SHA256"; // Function name
static {
desc.add(JMeterUtils.getResString("String to encrypt")); // 函数助手中显示的参数说明,对应到参数
desc.add(JMeterUtils.getResString("function_name_paropt"));// 保存函数返回结果的变量,用于引用
}
private CompoundVariable strText, varName;
@Override
public List<String> getArgumentDesc() {
return desc;
}
public SHA256() {
}
@Override
public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
MessageDigest md;
String strTmp = strText.execute().trim();
String encodeStr = "";
try {
md = MessageDigest.getInstance("SHA-256");
md.update(strTmp.getBytes("UTF-8"));
encodeStr = byte2Hex(md.digest());
} catch (NoSuchAlgorithmException ex) {
log.error("String encryption exception",ex);
} catch (UnsupportedEncodingException ex) {
log.error("String encryption exception",ex);
}
if (varName != null) {
JMeterVariables vars = getVariables();
final String varTrim = varName.execute().trim();
if (vars != null && varTrim.length() > 0) {
vars.put(varTrim, encodeStr);
}
}
return encodeStr;
}
/**
* 将byte转为16进制
*
* @param bytes
* @return
*/
private String byte2Hex(byte[] bytes) {
StringBuffer stringBuffer = new StringBuffer();
String temp = null;
for (int i = 0; i < bytes.length; i++) {
temp = Integer.toHexString(bytes[i] & 0xFF);
if (temp.length() == 1) {
// 1得到一位的进行补0操作
stringBuffer.append("0");
}
stringBuffer.append(temp);
}
return stringBuffer.toString();
}
@Override
public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
// 检查参数数量
checkParameterCount(parameters, 1, 2);
Object[] values = parameters.toArray();
strText = (CompoundVariable) values[0];
if (values.length > 1){
varName = (CompoundVariable) values[1];
} else {
varName = null;
}
}
@Override
public String getReferenceKey() {
return KEY;
}
}
作为一个代码渣,代码是在网上down的,参考:https://blog.csdn.net/y100100/article/details/80701049
五、导入Jmeter
右键-导出
导出的jar包更名为ApacheJMeter_functions.jar,同时覆盖掉Jmeter\lib\ext(不是源码版,是Binaries版)下的ApacheJMeter_functions.jar,重启jmeter,函数助手里就可以看到SHA256函数了。