1. 程式人生 > 程式設計 >基於springboot+jwt實現重新整理token過程解析

基於springboot+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,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,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:

基於springboot+jwt實現重新整理token過程解析

這裡是登陸成功之後的顯示:

基於springboot+jwt實現重新整理token過程解析

這裡是token過期後,refToken重新整理的token:

基於springboot+jwt實現重新整理token過程解析

這裡是設定的refToken過期後在訪問的顯示:

基於springboot+jwt實現重新整理token過程解析

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。