天天看點

如何在Loadrunner11中解決HTTP BASIC認證登入報401的問題

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。歡迎通路我的部落格 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);