當(dāng)當(dāng)當(dāng)~~~有小哥哥指出使用diget函數(shù)就可以實(shí)現(xiàn)塌计。如果只是需要SHA256加密的可以直接使用函數(shù)助手diget挺身。
這個(gè)當(dāng)作Jmeter二次開發(fā)入門學(xué)習(xí)好了侯谁。
最近測(cè)試的注冊(cè)锌仅、登錄接口章钾,密碼通過SHA256加密,諸如以前的MD5加密可以直接使用Jmeter函數(shù)助手進(jìn)行加密热芹,SHA256加密沒有現(xiàn)成的函數(shù)贱傀。
在網(wǎng)上搜索了大半天,基本兩個(gè)路線伊脓,一個(gè)是通過Beanshell腳本府寒,一個(gè)是對(duì)Jmeter進(jìn)行二次開發(fā),自行添加函數(shù)报腔,之后使用函數(shù)助手進(jìn)行調(diào)用株搔。
效果:覺得寫進(jìn)函數(shù)助手是個(gè)一勞永逸的辦法,于是開始根據(jù)網(wǎng)上搜尋的教程實(shí)踐纯蛾。然而纤房,還是遇到了很多坑!7摺E谝獭!畢竟自己是個(gè)渣碰煌,別人過程一沒寫全舒岸,我就短路了。
實(shí)踐完了之后發(fā)現(xiàn)芦圾,也不算難嘛蛾派。
很多事情都是這樣,你做的時(shí)候覺得難度挺大个少,回頭來看碍脏, 也就這點(diǎn)破事。
一稍算、源碼下載
Jmeter官網(wǎng)是提供源碼下載的:http://jmeter.apache.org/download_jmeter.cgi
頁(yè)面提供當(dāng)前最新版本下載典尾,歷史版本點(diǎn)擊下面:
選擇source:
下載對(duì)應(yīng)版本的源碼的壓縮包,然后解壓糊探。
二钾埂、IDE的選擇
IDE,也就是集成開發(fā)環(huán)境科平,常見的就是myEclipse褥紫、eclipse、IDEA等瞪慧。eclipse和IDEA的社區(qū)版都是免費(fèi)的髓考。
因?yàn)樾枰玫綄?dǎo)出部分文件夾為jar包的格式,我在IDEA上找了好久都沒找到這個(gè)功能弃酌,所以踩了一下午坑之后決定轉(zhuǎn)用eclipse了氨菇。如果你們誰發(fā)現(xiàn)IDEA上的這個(gè)功能怎么操作的分享一下儡炼。
無腦走教程的就選eclipse。
下載:https://www.eclipse.org/downloads/
默認(rèn)進(jìn)去是win版的查蓉,需要mac或linux版的點(diǎn)"Download Packages"進(jìn)入
三乌询、導(dǎo)入源碼
1.打開eclipse,這里是eclipse的workspace,簡(jiǎn)單說就是在eclipse中新建項(xiàng)目會(huì)默認(rèn)存放在這個(gè)文件夾下
2.新建一個(gè)java project
寫工程名:
勾選允許導(dǎo)出
3.導(dǎo)入源碼
右鍵項(xiàng)目名-Import(忽略上面那個(gè)Jmeter豌研,是自己練手做的)
選擇你解壓了Jmeter的目錄:
導(dǎo)入后可以看到:
你導(dǎo)入之后應(yīng)該會(huì)看到src的文件夾下有紅色的小叉妹田,是因?yàn)槿鄙僖蕾嚨膉ar包。(我是因?yàn)橹熬毷謺r(shí)已經(jīng)添加了依賴包)
4.導(dǎo)入依賴包
一種方式是鹃共,把你可執(zhí)行版(Binaries版)Jmeter里lib目錄下的jar包都復(fù)制到源碼的lib目錄下鬼佣。
另一種使用ant框架導(dǎo)入依賴包:
雙擊:download_jars
可以從控制臺(tái)看到下載包的情況
下載jar結(jié)束后,項(xiàng)目右鍵-properties
把這兩個(gè)文件改為.classpath和.project
可通過終端命令
mv eclipse.classpath .classpath
重啟eclipse之后就不會(huì)再有紅色叉了霜浴。
四沮趣、二次開發(fā)
在該目錄下,新建一個(gè)class文件坷随,SHA256.java
復(fù)制以下代碼:
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;
/*
* 對(duì)字符串進(jìn)行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")); // 函數(shù)助手中顯示的參數(shù)說明房铭,對(duì)應(yīng)到參數(shù)
desc.add(JMeterUtils.getResString("function_name_paropt"));// 保存函數(shù)返回結(jié)果的變量,用于引用
}
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轉(zhuǎn)為16進(jìn)制
*
* @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得到一位的進(jìn)行補(bǔ)0操作
stringBuffer.append("0");
}
stringBuffer.append(temp);
}
return stringBuffer.toString();
}
@Override
public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
// 檢查參數(shù)數(shù)量
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;
}
}
作為一個(gè)代碼渣温眉,代碼是在網(wǎng)上down的缸匪,參考:https://blog.csdn.net/y100100/article/details/80701049
五、導(dǎo)入Jmeter
右鍵-導(dǎo)出
導(dǎo)出的jar包更名為ApacheJMeter_functions.jar类溢,同時(shí)覆蓋掉Jmeter\lib\ext(不是源碼版凌蔬,是Binaries版)下的ApacheJMeter_functions.jar,重啟jmeter闯冷,函數(shù)助手里就可以看到SHA256函數(shù)了砂心。