我們在定義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
,分別儲存在threadlocaltoken
和redis
中。
之所以要把新令牌儲存到threadlocaltoken
裡面,是因為要向aop切面類傳遞這個新令牌。雖然oauth2filter
中有dofilterinternal()
方法,我們可以得到響應並且寫入新令牌。但是這個做非常麻煩,首先我們要通過io流讀取響應中的資料,然後還要把資料解析成json物件,最後再放入這個新令牌。
如果我們定義了aop
切面類,攔截所有web方法返回的r物件,然後在r物件裡面新增新令牌,這多簡單啊。但是oauth2filter
和aop
切面類之間沒有呼叫關係,所以我們很難把新令牌傳給aop
切面類。
這裡我想到了threadlocal
,只要是同乙個執行緒,往threadlocal裡面寫入資料和讀取資料是完全相同的(可以理解為每個執行緒獨享的乙個小盒子)。在web專案中,從oauth2filter
到aop
切面類,都是由同乙個執行緒來執行的,中途不會更換執行緒。所以我們可以放心的把新令牌儲存都在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不可明文,如果是明文,那就太危險了,所以要採用...