Jmeter踩坑:導(dǎo)入源碼二次開發(fā),函數(shù)助手添加自定義函數(shù)-SHA256加密

當(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


image.png

可通過終端命令
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ù)了砂心。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蛇耀,隨后出現(xiàn)的幾起案子辩诞,更是在濱河造成了極大的恐慌,老刑警劉巖纺涤,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件译暂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡撩炊,警方通過查閱死者的電腦和手機(jī)外永,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拧咳,“玉大人伯顶,你說我怎么就攤上這事。” “怎么了祭衩?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵灶体,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我汪厨,道長(zhǎng),這世上最難降的妖魔是什么愉择? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任劫乱,我火速辦了婚禮,結(jié)果婚禮上锥涕,老公的妹妹穿的比我還像新娘衷戈。我一直安慰自己,他們只是感情好层坠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布殖妇。 她就那樣靜靜地躺著,像睡著了一般破花。 火紅的嫁衣襯著肌膚如雪谦趣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天座每,我揣著相機(jī)與錄音前鹅,去河邊找鬼。 笑死峭梳,一個(gè)胖子當(dāng)著我的面吹牛舰绘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播葱椭,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼捂寿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了孵运?” 一聲冷哼從身側(cè)響起秦陋,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎治笨,沒想到半個(gè)月后踱侣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡大磺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年抡句,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杠愧。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡待榔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锐锣,我是刑警寧澤腌闯,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站雕憔,受9級(jí)特大地震影響姿骏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斤彼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一分瘦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧琉苇,春花似錦嘲玫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至穷蛹,卻和暖如春土陪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肴熏。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工旺坠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扮超。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓取刃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親出刷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子璧疗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容