重新整理令牌應該如何設計

2021-10-18 10:16:31 字數 2609 閱讀 1005

我們在定義jwtutil工具類的時候,生成的token都有過期時間。那麼問題來了,假設token過期時間為15天,使用者在第14天的時候,還可以免登入正常訪問系統。但是到了第15天,使用者的token過期,於是使用者需要重新登入系統。

httpsession的過期時間比較優雅,預設為15分鐘。如果使用者連續使用系統,只要間隔時間不超過15分鐘,系統就不會銷毀httpsession物件。jwt的令牌過期時間能不能做成httpsession那樣超時時間,只要使用者間隔操作時間不超過15天,系統就不需要使用者重新登入系統。

實現這種效果的方案有兩種:雙token和token快取,這裡重點講一下token快取方案。

token快取方案是把token快取到redis,然後設定redis裡面快取的token過期時間與正常token的相同,或者快取token時間是兩倍,然後每一次登入都會重新整理快取token的過期時間。

1、本地token和快取token時間相同

簡單來說就是 每次登入都會重新整理快取token,然後本地token過期了(假設15天過期),再去看快取token是否過期:

token失效,但是快取還存在的情況:如果沒過期,就重新生成乙個本地token,隨著響應訊息發回去。

token失效,快取也不存在的情況:如果過期了,那麼代表使用者連續15天都沒有登入,即快取token15天內都沒被重新整理,所以會過期,就需要重新登陸。

2、快取token時間是本地token時間的兩倍(專案小白辦公系統使用的方案)

不是每次登入都會重新整理快取token。只有在本地token過期了,且快取token沒過期的時候才會去更新本地token。

token失效,但是快取還存在的情況:假如本地token是15天過期,那麼15天之前我幾乎每天都登入,等到15天以後,即15號-30號這個時間內,我們的快取token不會過期,只要在這個時間內登入一次,伺服器就會生成乙個新的本地token,並且更新快取token的時間。

token失效,快取也不存在的情況:假設15號本地token過期後,15號-30號內都沒有登陸過,那麼快取token也會過期,相當於連續15天都沒有登陸過。這樣就必須重新登陸了。

在我們的方案中,服務端重新整理token過期時間,其實就是生成乙個新的token給客戶端。那麼客戶端怎麼知道這次響應帶回來的token是更新過的呢?這個問題很容易解決。

只要使用者成功登陸系統,當後端伺服器更新token的時候,就在響應中新增token。客戶端那邊判斷每次ajax響應裡面是否包含token,如果包含,就把token儲存起來,覆蓋原來的token就可以了。

我們定義oauth2filter類攔截所有的http請求,一方面它會把請求中的token字串提取出來,封裝成物件交給shiro框架;另一方面,它會檢查token的有效性。如果token過期,那麼會生成新的token,分別儲存在threadlocaltokenredis中。

之所以要把新令牌儲存到threadlocaltoken裡面,是因為要向aop切面類傳遞這個新令牌。雖然oauth2filter中有dofilterinternal()方法,我們可以得到響應並且寫入新令牌。但是這個做非常麻煩,首先我們要通過io流讀取響應中的資料,然後還要把資料解析成json物件,最後再放入這個新令牌。

如果我們定義了aop切面類,攔截所有web方法返回的r物件,然後在r物件裡面新增新令牌,這多簡單啊。但是oauth2filteraop切面類之間沒有呼叫關係,所以我們很難把新令牌傳給aop切面類。

這裡我想到了threadlocal,只要是同乙個執行緒,往threadlocal裡面寫入資料和讀取資料是完全相同的(可以理解為每個執行緒獨享的乙個小盒子)。在web專案中,從oauth2filteraop切面類,都是由同乙個執行緒來執行的,中途不會更換執行緒。所以我們可以放心的把新令牌儲存都在threadlocal裡面,aop切面類可以成功的取出新令牌,然後往r物件裡面新增新令牌即可。

threadlocaltoken是我自定義的類,裡面包含了threadlocal型別的變數,可以用來儲存執行緒安全的資料,而且避免了使用執行緒鎖。

struts令牌解決重複重新整理提交

insert步驟。原來的步驟insert.jsp form 點提交 insertaction 做插入的 insert.jsp跳回原來頁面 但是再次使用重新整理會再次提交。解決方法 tokenaction insert.jsp form insertaction insert.jsp 也就是在提交前先...

ThinkPHP5表單令牌重新整理

製作登入頁面的時候,加入了表單令牌,賬號和密碼輸入錯誤後,再登入的話,會提示表單令牌錯誤,這是因為舊的令牌已經過期了,我們要處理下前端的token,修復的辦法,在路由檔案下加入 重新整理表單令牌,然後前端提交表單後,js呼叫,這裡的我用的是 token route get refresh token...

PHP Token 令牌 設計

設計目標 避免重複提交資料.檢查來路,是否是外部提交 匹配要執行的動作 如果有多個邏輯在同乙個頁面實現,比如新增,刪除,修改放到乙個php檔案裡操作 這裡所說的token是在頁面顯示的時候,寫到form的乙個隱藏表單項 type hidden token不可明文,如果是明文,那就太危險了,所以要採用...