本發(fā)明涉及計算機應(yīng)用,特別涉及一種多并發(fā)請求場景下刷新令牌的方法。
背景技術(shù):
1、token在計算機身份認證中是令牌的意思,表示執(zhí)行某些操作的權(quán)利的對象。使用令牌token進行用戶身份鑒權(quán)認證,能防止未經(jīng)授權(quán)的用戶訪問受限資源,提高安全性,減少網(wǎng)絡(luò)傳輸和服務(wù)器的負載,提高性能,減少服務(wù)器負擔(dān)。
2、flutter是谷歌推出的一個開源的ui(用戶界面)軟件開發(fā)工具包,用于開發(fā)跨平臺的應(yīng)用程序。它允許開發(fā)者使用一套代碼庫來構(gòu)建在android、ios、web和桌面平臺上運行的高性能、美觀的應(yīng)用程序。
3、flutter網(wǎng)絡(luò)客戶端在向服務(wù)端請求數(shù)據(jù)過程中,會在請求中帶上令牌token用于服務(wù)端鑒權(quán)。為了保證安全,令牌token要有時效性,為了避免令牌token被惡意攻擊或過期,客戶端需要在發(fā)送請求后被服務(wù)端告知令牌token過期時,向服務(wù)端發(fā)送刷新令牌token的請求,以獲得新的令牌token,然后再重新請求之前失敗的請求。
4、隨著flutter應(yīng)用客戶端功能越來越復(fù)雜,在flutter客戶端使用過程中,會存在同時發(fā)出多個異步請求的情況。在令牌token失效的情況下會觸發(fā)多次刷新token的請求,導(dǎo)致同時異步刷新令牌token多次,但是最終只會有一個令牌token有效,多個請求會拿著錯誤的令牌token再次重復(fù)請求,又會導(dǎo)致令牌token失效報錯,引發(fā)連環(huán)問題。
5、基于上述情況,本發(fā)明提出了一種多并發(fā)請求場景下刷新令牌的方法。
技術(shù)實現(xiàn)思路
1、本發(fā)明為了彌補現(xiàn)有技術(shù)的缺陷,提供了一種簡單高效的多并發(fā)請求場景下刷新令牌的方法。
2、本發(fā)明是通過如下技術(shù)方案實現(xiàn)的:
3、一種多并發(fā)請求場景下刷新令牌的方法,其特征在于:包括以下步驟:
4、步驟s1、統(tǒng)一攔截網(wǎng)絡(luò)請求任務(wù)的服務(wù)端返回結(jié)果response,判斷當(dāng)前請求任務(wù)返回令牌token是否失效;若返回令牌token失效,則刷新令牌token;可能會同時存在多個異步請求任務(wù)需要刷新令牌token;
5、步驟s2、將攔截到的所有需要刷新令牌token的異步請求任務(wù)放進一個flutter同步隊列queue中,依次執(zhí)行刷新任務(wù),同時將新任務(wù)不斷添加進同步隊列queue中;
6、步驟s3、在同步隊列queue中,依次執(zhí)行刷新任務(wù);
7、步驟s4、取出隊列中第一個任務(wù),判斷全局令牌token是否為有效狀態(tài):
8、若全局令牌token為有效狀態(tài),則重新請求最新的全局令牌token;
9、若全局令牌token為失效狀態(tài),則觸發(fā)請求獲取新的全局令牌token;
10、步驟s5、重復(fù)步驟s4,直至隊列中的任務(wù)都執(zhí)行完,成隊列清空。
11、所述步驟s4中,取出隊列中第一個任務(wù),判斷之前任務(wù)請求時的令牌token與當(dāng)前最新的全局令牌token是否相同:
12、若不同,則說明全局令牌token已經(jīng)被刷新成有效狀態(tài),直接用最新的全局令牌token重新請求,并記錄為重新請求的任務(wù),然后從同步隊列queue中刪除對應(yīng)的任務(wù);
13、若相同,則說明當(dāng)前全局令牌token還是失效狀態(tài),觸發(fā)請求獲取新令牌token。
14、所述步驟s4中,如果請求獲取新令牌token失敗,則該請求任務(wù)直接返回獲取新令牌token失敗的響應(yīng)數(shù)據(jù)response;
15、如果請求獲取新令牌token成功,則更新全局令牌token,再用新的全局令牌token重新請求,并記錄為重新請求的任務(wù),然后從同步隊列queue中刪除對應(yīng)的任務(wù)。
16、所述步驟s4中,記錄重新請求全局令牌token的任務(wù),當(dāng)任務(wù)再次請求成功時,刪除對應(yīng)的重新請求記錄;
17、當(dāng)任務(wù)再次請求失敗時,如果判定該任務(wù)是之前重新請求的任務(wù),則不再執(zhí)行刷新令牌token操作,直接返回獲取新令牌token失敗的響應(yīng)數(shù)據(jù)response。
18、一種多并發(fā)請求場景下刷新令牌的系統(tǒng),其特征在于:包括任務(wù)攔截模塊,同步隊列管理模塊和令牌刷新模塊;
19、所述任務(wù)攔截模塊負責(zé)統(tǒng)一攔截網(wǎng)絡(luò)請求任務(wù)的服務(wù)端返回結(jié)果response,判斷當(dāng)前請求任務(wù)返回令牌token是否失效;若返回令牌token失效,則刷新令牌token;
20、所述同步隊列管理模塊負責(zé)將攔截到的所有需要刷新令牌token的異步請求任務(wù)放進一個flutter同步隊列queue中,依次執(zhí)行刷新任務(wù),同時將新任務(wù)不斷添加進同步隊列queue中;
21、所述令牌刷新模塊負責(zé)在同步隊列queue中依次執(zhí)行刷新任務(wù);
22、取出隊列中第一個任務(wù),判斷全局令牌token是否為有效狀態(tài):
23、若全局令牌token為有效狀態(tài),則所述令牌刷新模塊重新請求最新的全局令牌token;
24、若全局令牌token為失效狀態(tài),則所述令牌刷新模塊觸發(fā)請求獲取新的全局令牌token;
25、再繼續(xù)取出隊列中的第一個任務(wù),重復(fù)執(zhí)行上述邏輯,直至隊列中的任務(wù)都執(zhí)行完,成隊列清空。
26、所述令牌刷新模塊取出隊列中第一個任務(wù)后,先判斷之前任務(wù)請求時的令牌token與當(dāng)前最新的全局令牌token是否相同:
27、若不同,則說明全局令牌token已經(jīng)被刷新成有效狀態(tài),直接用最新的全局令牌token重新請求,并記錄為重新請求的任務(wù),然后從同步隊列queue中刪除對應(yīng)的任務(wù);
28、若相同,則說明當(dāng)前全局令牌token還是失效狀態(tài),觸發(fā)請求獲取新令牌token;
29、如果請求獲取新令牌token失敗,則該請求任務(wù)直接返回獲取新令牌token失敗的響應(yīng)數(shù)據(jù)response;
30、如果請求獲取新令牌token成功,則更新全局令牌token,再用新的全局令牌token重新請求,并記錄為重新請求的任務(wù),然后從同步隊列queue中刪除對應(yīng)的任務(wù)。
31、所述令牌刷新模塊記錄重新請求全局令牌token的任務(wù),并在任務(wù)再次請求成功時,刪除對應(yīng)的重新請求記錄;
32、當(dāng)任務(wù)再次請求失敗時,所述令牌刷新模塊判定該任務(wù)收否為之前重新請求的任務(wù),若是則不再執(zhí)行刷新令牌token操作,直接返回獲取新令牌token失敗的響應(yīng)數(shù)據(jù)response。
33、一種多并發(fā)請求場景下刷新令牌的設(shè)備,其特征在于:包括存儲器和處理器;所述存儲器用于存儲計算機程序,所述處理器用于執(zhí)行所述計算機程序時實現(xiàn)上述的方法步驟。
34、一種可讀存儲介質(zhì),其特征在于:所述可讀存儲介質(zhì)上存儲有計算機程序,所述計算機程序被處理器執(zhí)行時實現(xiàn)上述的方法步驟。
35、本發(fā)明的有益效果是:該多并發(fā)請求場景下刷新令牌的方法,能夠在不影響每個業(yè)務(wù)獨立請求的情況下,無感自動刷新令牌token并重新請求,解決了多并發(fā)請求場景下刷新令牌token的問題;同時代碼無侵入性,不影響單個網(wǎng)絡(luò)請求相關(guān)代碼,不會增加單個網(wǎng)絡(luò)請求的成本。