愛伊米

前端如何實現token的無感重新整理

作者:xiangzhihong

通常,對於一些需要記錄使用者行為的系統,在進行網路請求的時候都會要求傳遞一下登入的token。不過,為了介面資料的安全,伺服器的token一般不會設定太長,根據需要一般是1-7天的樣子,token過期後就需要重新登入。不過,頻繁的登入會造成體驗不好的問題,因此,需要體驗好的話,就需要定時去重新整理token,並替換之前的token。

要做到token的無感重新整理,主要有3種方案:

方案一:

後端返回過期時間,前端每次請求就判斷token的過期時間,如果快到過期時間,就去呼叫重新整理token介面。

缺點

:需要後端額外提供一個token過期時間的欄位;使用了本地時間判斷,若本地時間被篡改,特別是本地時間比伺服器時間慢時,攔截會失敗。

方法二

寫個定時器,然後定時重新整理token介面。

缺點

:浪費資源,消耗效能,不建議採用。

方法三

在請求響應攔截器中攔截,判斷token 返回過期後,呼叫重新整理token介面。

問題一:如何防止多次重新整理token

為了防止多次重新整理token,可以透過一個變數isRefreshing 去控制是否在重新整理token的狀態。

問題二:同時發起兩個或者兩個以上的請求時,怎麼重新整理token

當第二個過期的請求進來,token正在重新整理,我們先將這個請求存到一個數組佇列中,想辦法讓這個請求處於等待中,一直等到重新整理token後再逐個重試清空請求佇列。

那麼如何做到讓這個請求處於等待中呢?為了解決這個問題,我們得藉助Promise。將請求存進佇列中後,同時返回一個Promise,讓這個Promise一直處於Pending狀態(即不呼叫resolve),此時這個請求就會一直等啊等,只要我們不執行resolve,這個請求就會一直在等待。當重新整理請求的介面返回來後,我們再呼叫resolve,逐個重試。