版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。歡迎通路我的部落格 https://blog.csdn.net/smooth00/article/details/65629918
在對Carte+kettle的性能測試過程中,通過在loadrunner中用web_set_user("cluster", "cluster","172.17.2.89:8080");可以登入carte服務頁面,但是壓力測試過程中發現報告中産生了大量的HTTP 401請求。雖然這個錯誤不影響最終的測試,但是讓追求完美的我,感覺不舒服,總覺得哪裡有個重要事情我沒搞明白。
通過Fiddler工具也能捕捉到這個401錯誤,但是登入成功後,接着就是HTTP 200,這和loadrunner傳回結果一緻(先報401,接着就報200)。
這是為什麼呢,難道是Carte服務有問題?帶着這個問題上網找相關資源,同時與開發一起探讨,最終得到一個比較有說服力的解答如下:
------------------------------------------------------------------------------------------------------------------------------------------------------------------
關于BASIC認證的過程
1. 用戶端向伺服器請求資料,請求的内容可能是一個網頁或者是一個其它的MIME類型,此時,假設用戶端尚未被驗證,則用戶端提供如下請求至伺服器:
Get /index.html HTTP/1.0
Host:www.google.com
2. 伺服器向用戶端發送驗證請求代碼401,伺服器傳回的資料大抵如下:
HTTP/1.0 401 Unauthorised
Server: SokEvo/1.0
WWW-Authenticate: Basic realm="google.com"
Content-Type: text/html
Content-Length: xxx
3. 當符合http1.0或1.1規範的用戶端(如IE,FIREFOX)收到401傳回值時,将自動彈出一個登入視窗,要求使用者輸入使用者名和密碼。
4. 使用者輸入使用者名和密碼後,将使用者名及密碼以BASE64加密方式加密,并将密文放入前一條請求資訊中,則用戶端發送的第一條請求資訊則變成如下内容:
Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx
注:xxxx....表示加密後的使用者名及密碼。
5. 伺服器收到上述請求資訊後,将Authorization字段後的使用者資訊取出、解密,将解密後的使用者名及密碼與使用者資料庫進行比較驗證,如使用者名及密碼正确,伺服器則根據請求,将所請求資源發送給用戶端
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
說明這個401錯誤是由HTTP BasicAuthenticator認證機制決定的,雖然得到了解答,但我還是不滿意,如何才能不報這個錯呢,對比了一下Jmeter,就發現Jmeter沒有這個問題,因為Jmeter通過加HTTP授權管理器就能解決,如下所示:
對比loadrunner的web_set_user函數,我們會發現,Loadrunner正是少了這個BASIC_DIGEST屬性,通過網上找資料,發現一個英文的資料有很明确的說明,參考連結如下
https://ptfrontline.wordpress.com/2009/12/23/loadrunner-http-401-authentication/
針對這上面英文資料說明,我就在web_set_user("cluster", "cluster","172.17.2.89:8080");後面再加一句web_set_sockets_option("INITIAL_BASIC_AUTH","1"); 然後回放腳本,不再報401錯誤,很正常的顯示出HTTP 200,而且直接馬上顯示完美的 Show status ! 給自己鼓個掌!!!!!
最後提供一下http 基本認證登入的腳本以供大家參考:
web_set_user("cluster",
"cluster", //r_decrypt("58cf7265b1677820107f74"), //可以選擇對密碼加密
"172.17.2.89:8080");
web_set_sockets_option("INITIAL_BASIC_AUTH","1");
web_url("172.17.2.89:8080",
"URL=http://172.17.2.89:8080/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t2.inf",
"Mode=HTTP",
LAST);