jwt刷新token


前一段時間講過了springboot+jwt的整合,但是因為一些原因(個人比較懶)並沒有更新關於token的刷新問題,今天跟別人閑聊,聊到了關於業務中token的刷新方式,所以在這里我把我知道的一些點記錄一下,也希望能幫到一些有需要的朋友,同時也希望給我一些建議,話不多說,上代碼!

1:這種方式為在線刷新,比方說設定的token有效期為30min,那么每次訪問資源時,都會在攔截器中去判斷一下

token是否過期,如果沒有過期就刷新token的時間為30min,反之則會重新登錄,需要注意的是這種方式我是在登

錄以后就將token存在了redis.

      //登錄方法中將token存在redis
        String token = JwtUtil.sign(userName,user.getId());
        redisUtil.set(UserConstants.PREFIX_USER_TOKEN + token, token,UserConstants.TOKEN_EXPIRE_TIME);
        Map map=new HashMap();
        map.put("token", token);
        return Result.success(map);

//在攔截器中獲取token,並判斷token的有效期 String token
= req.getHeader(UserConstants.ACCESS_TOKEN); if (Strings.isNullOrEmpty(token)) { return false; } Object reqToken=redisUtil.get(UserConstants.PREFIX_USER_TOKEN+token); if (ObjectUtils.isEmpty(reqToken)) { return false; } if(redisUtil.getExpire(UserConstants.PREFIX_USER_TOKEN+token) <1){ return false; } redisUtil.set(UserConstants.PREFIX_USER_TOKEN + token, token,UserConstants.TOKEN_EXPIRE_TIME); return true;

2.這種方式為免密登錄,也就是說,登錄一次后就不用再通過賬號密碼登錄,思路就是在生成token時候,在生成一個refToken來刷新,比如說

我的token設置的有效期為5分鍾,refToken設置的為一周,那么在請求時候則判斷token是否過期,如果已經過期 就判斷refToken的時間

有沒有過期,沒有過期則生成一個新的token給前端,同時重置這個refToken(看你自己),如果refToken已經過期則重新登錄,需要注意的是這次生成的token並不存在redis中,而是將refToken存在redis。

        // 生成token
        String token = JwtUtil.sign(userName,user.getId());
        //刷新token,免密登陸
        String refToken=UUID.randomUUID().toString().replaceAll("-","");
        redisUtil.set(UserConstants.PREFIX_USER_TOKEN + token, refToken,UserConstants.TOKEN_EXPIRE_TIME);
        Map map=new HashMap();
        map.put("token", token);
        map.put("refToken", refToken);
        return Result.success(map);

       //這里在攔截其中校驗token,如果校驗失敗,則判斷redis的refToken是否過期
       if (!JwtUtil.verify(token)) {
            if(redisUtil.getExpire(UserConstants.PREFIX_USER_TOKEN+token)>=1){
                HttpServletResponse httpServletResponse = (HttpServletResponse) response;
                String newRefToken=UUID.randomUUID().toString().replaceAll("-","");
                Integer userId=Integer.parseInt(JwtUtil.getUserId(token));
                User user=userService.selectOne(userId);
                String newToken=JwtUtil.sign(user.getUserName(),user.getId());
                httpServletResponse.setHeader("newToken",newToken);
                httpServletResponse.setHeader("newRefToken",newRefToken);
                return true;
            }else{
                return false;
            }
        }

3.貼一下我在postMan中的測試結果:

這里是登錄后返回的token和refToken:

這里是登陸成功之后的顯示:

 

這里是token過期后,refToken刷新的token:

這里是設定的refToken過期后在訪問的顯示:

 

 

參考鏈接:https://zhuanlan.zhihu.com/p/57608281

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM