Web的登陸鑑權方式(cookie base):
HTTP的特性:短鏈接、是無狀態的、每次發送的請求都是新的,服務器沒法知道每次請求是哪一個用戶發送的?那麼如何才能知道每次發送的請求是哪一個用戶發送的呢? --- 經過session實現web
(客戶端)
client(web) ------------>server
(服務端)json
網站調用登陸接口傳入username、password 到達服務器端此時服務器會鑑權,鑑權經過此時服務器會產生一個session,此時這個session是有一個sessionid的,而後服務器將這個session加密後經過set-cookie的方式發送給客戶端(從cookie裏面發送,一串相似指紋的token)客戶端把token解出來之後能夠知道在服務端對應的sessionid是哪個,以後每一次發送的請求都會帶上cookie,cookie裏面的信息是token,服務器看到token之後會把token和session進行關聯起來。這樣服務器就能夠知道那個用戶登陸了,用戶是誰。登陸態是在cookie中,清掉cookie須要從新登陸。cookie是存在哪裏呢?--瀏覽器中瀏覽器
App的登陸鑑權方式(token base):服務器
(客戶端)
client(app) ------------>server
(服務端)cookie
經過服務器發送一個數據:本地存文件-相似cookie方式
服務器端會實現一套cookie過時機制,這個方法並不簡單。那麼有沒有什麼更簡單的辦法呢?session
一個請求(包含username/password)發送給服務器,服務器會鑑權,這時候沒有session這時候經過username/password知道哪一個用戶登陸,而後將用戶信息加密(加密成一個token-相似字符串)而後把token發送給客戶端-客戶端把token保存起來,以後每一次發送服務端的請求都帶上token,服務器端收到token之後能夠經過token反解出來這個用戶是誰?及過時時間,好比token是否在過時時間以內,若是已經超過過時時間就實效了,在發送一個新的token給我。app
這種方式的優點和劣勢:
在服務器端沒有開任何的session,沒有什麼空間開銷,撐得用戶數會多一些。可是解token會佔用cpu,消耗時間。測試
思考一個問題:http請求經過什麼方式把token發到服務器?
通常把token放到header中發送到服務器 。在訪問須要鑑權的接口時,咱們將token放到http請求的header中,若是該token是有效的,那麼接口正常返回,不然接口返回401錯誤。網站
實 現加密
POST /login username/password這個接口提供了登陸功能。
若是username和password組合是正確的,該接口將返回以下的信息
{ "id":2, "username":"admin", "token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWQiOjIsImlhdCI6MTQ3MzQ5Nzc1MCwiZXhwIjoxNTU5ODk3NzUwfQ.CkxZAESKLNVu8FOOkxqdbpBukl2FFteAvPWOQulXPgc" }
1.咱們將註冊的API接口停掉,避免每次都註冊。由於咱們要驗證的是登陸接口。咱們如今取一個註冊已經好的用戶名和密碼登陸系統user_251,user251,以下圖所示:
2.運行結果後,查看結果樹查看咱們發送的請求是否發送成功,返回token是否成功。
如上圖所示,咱們登陸接口發送的請求成功,而且返回了一個token這個token是加密過得。那麼咱們接下來如何獲取這個token的值呢呢?當熱,咱們能夠經過變量的方式獲取token的值,具體請看下面的操做。
3.咱們在登陸請求右鍵---添加--後置處理器--選擇json extractor 方式來獲取token的值
4.在json extractor中須要進行以下設置,咱們在variablenames中設置一個變量名,方便後面引用這個變量名,而後獲取token的值$.token表明的是從根下面取第一個token值,找不到就報錯:NOT FOUND
咱們設置的變量名token,獲取這個token變量的目的是方便在後面使用,很重要哦!因此,先暫時介紹到這裏。咱們繼續聊正題!
5.設置完成後,咱們須要作登錄後的斷言,沒有斷言的接口測試是不嚴謹的。這裏咱們使用jmeter提供給咱們的「響應斷言」,由於這種的方式比較簡單,好理解,也能解決實際問題。如圖所示,咱們添加一個響應斷言:
6.響應斷言裏面參數設置以下圖所示:
7.驗證斷言是否成功,咱們再次運行登錄接口請求API。