在對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加密方式加密,並將密文放入前一條請求信息中,則客戶端發送的第一條請求信息則變成如下內容:
Get /index.html HTTP/1.0
Host:www.google.com
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);
