昨天被人問了一個問題:為什么我用Jmeter先創建一個登錄請求,然后創建一個操作(比如計算賬單)請求,運行之后結果樹中卻是status_code=401(即登錄失敗),我明明登錄了啊....
emmm.....,這貌似是我回答過幾次的問題,而且好像新人都容易犯這個錯,我覺得我有必要寫點什么。
首先我們來了解一下這個“登錄”。一個網站呢,我們一般先登錄,然后登錄成功進入網站執行一些操作。這看上去和上面的流程一模一樣,沒毛病。這是UI層的,我們在深入點,到接口層。
為什么你不登錄的時候直接訪問計算賬單的url,系統會自動幫你跳轉到登錄界面呢?因為它通過一些機制判斷了你不是“登錄中”的狀態。
而這機制中,簡單的來說就是用一個值的合法性來判定,即Cookie(假設這個系統是用的cookie校驗機制,當然還有什么token之類的啦,具體看系統)。
而我們使用瀏覽器登錄-->計算賬單-->付款...等一系列流程之所以這么順暢,是因為瀏覽器在之后發送請求的時候自動帶上了你登錄所產生的Cookie(瀏覽器這種機制為后來的Xss和Csrf攻擊提供了好環境)。
登錄過程中客戶端(瀏覽器)和服務器的交互,簡單點說大概是這樣的:(其實之前應當還有兩步:1、用戶在客戶端(瀏覽器)上進行訪問;2、服務器收到請求返回一個狀態碼401,告知客戶端需要登錄。這樣才是一個比較健全的登錄過程)
1、用戶在瀏覽器中輸入賬號和密碼,發起登錄請求(requests);
2、服務器端收到請求,校驗賬號和密碼的正確性。如果正確,返回一個“登錄成功”的響應(response)給用戶,這個response中會有一個字段Cookie;
3、然后用戶之后發起的每個request中都會帶上cookie這個字段;
4、服務器之后會通過這個cookie來識別這個用戶,進而判斷用戶是否合法;(Session—Cookie)
以上,寫的比較簡單吧,知道這個意思就行。若想了解關於“登錄”過程中的交互具體細節,百度一下就OK了。
看完了上面的這個過程,這下應該知道為什么提示status_code=401了。因為你只是請求了登錄接口,然后就繼續執行下面的計算賬單了,計算賬單這個請求的cookie(令牌)呢?沒有,那么不好意思,服務器就不會認你,直接拒絕。
常見的解決方法有兩種:
方法1:在登錄請求后面加個后置處理器-->正則提取表達器,把登錄后response中的cookie提取出來,然后當做一個參數塞進計算賬單的Sampler中。
方法2:通過抓包等方式獲取登錄后的cookie,然后在線程組下面加個配置元件-->HTTP Cookie管理器,把Cookie寫進去,這樣這個線程組中的所有Sampler執行的時候都會帶上這里面的參數。(注意cookie的有效期)
具體實現細節就不說了,都是Jmeter基礎中的基礎,百度一下【Jmeter 正則提取】【Jmeter Cookie管理器】就行。
____雪中悍刀行