SpringBoot基于Redis实现token的在线续期的实践

 更新时间:2024年12月30日 10:56:49   作者:JKQingNing  
本文主要介绍了使用Redis实现JWT令牌在线续期的方案,通过在线续期token,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

相信很多小伙伴会发现,token这个东西在方便的同时也有一丝丝麻烦(想了解或学习token相关知识请移步:JAVA后端实现JWT令牌

原因很简单,其实就是token的过期时间究竟设置多久才算合理,一小时太短,一百年又太长。所以在线续期token是一种很好的解决方案,我的实现思路是:取消原先token自己的过期时长,然后将token存入redis中,key是token,value也是token,存进去什么不重要,重要的是可以根据key去获取value(有效并且没过期),需要的时候随时可以取出来,然后给这个redis一个过期时间,众所周知redis的过期时间是可以重置的,因此在用户每次进行操作的时候就重新给redis一个过期时间即可。大概思路就是这样,醍醐灌顶的小伙伴现在就可以自己去试一下!

这是我们之前的实现思路,也就是给token一个过期时间,然后token过期之后销毁。我们现在吧过期时间直接删掉。

我们现在只在token中放入我们需要的载荷信息以及签名算法。

然后我们需要去修改登录的逻辑,以前是生成一个token返回到前端,现在需要添加一步:将token存入redis中。

这样就实现了redis的储存,现在我们实现续期,我们去修改拦截器的逻辑。

以下是我项目中拦截器的代码: 

 public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) throws Exception {
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }

        List<String> asList = Arrays.asList("/login", "/pageHomeImages", "/register", "/doc.html", "/v2", "/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**");
        String requestUrl = request.getRequestURI();
        log.info("请求的url为:{}", requestUrl);

        if (asList.stream().anyMatch(requestUrl::contains)) {
            log.info("{}-->已放行", requestUrl);
            return true;
        }

        String token = request.getHeader("token");
        log.info("从请求头中获取的令牌:{}", token);

        if (!StringUtils.hasLength(token)) {
            log.warn("Token不存在");
            throw new CustomException(401, Constant.TOKEN_ERROR);
        }

        try {
            if (redisTemplate.opsForValue().get(token) != null) {
                Claims claims = JwtUtils.parseJWT(token);
                ThreadLocalContext.setUserId(claims.get("id").toString());
                redisTemplate.opsForValue().set(token, token, DELAYED_TIME, TimeUnit.SECONDS);
                log.info("{}-->已放行", requestUrl);
                log.info("用户:{}-->token已在线续期一小时", claims.get("id").toString());
                return true;
            } else {
                log.warn("token已过期");
                throw new CustomException(401, Constant.TOKEN_TIMEOUT);
            }
        } catch (Exception e) {
            log.error("token在线续期失败!");
            throw new CustomException(401, Constant.USER_STATUS_ERROR);
        }
    }

 至此已全部完成,只要用户有相关操作,即可实现刷新token的效果,在此基础上,还可以实现类似于获取当前过期时间并在此基础上增加时间等效果。

到此这篇关于SpringBoot基于Redis实现token的在线续期的实践的文章就介绍到这了,更多相关SpringBoot token的在线续期内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java基于socket实现的客户端和服务端通信功能完整实例

    Java基于socket实现的客户端和服务端通信功能完整实例

    这篇文章主要介绍了Java基于socket实现的客户端和服务端通信功能,结合完整实例形式分析了Java使用socket建立客户端与服务器端连接与通信功能,需要的朋友可以参考下
    2018-05-05
  • Java项目导入IDEA的流程配置以及常见问题解决方法

    Java项目导入IDEA的流程配置以及常见问题解决方法

    通常一个团队中可能有人用eclipse,有人用intelliJ,那么经常会出现需要导入别人用eclipse建好的web项目,下面这篇文章主要给大家介绍了关于Java项目导入IDEA的流程配置以及常见问题解决方法的相关资料,需要的朋友可以参考下
    2023-05-05
  • Java利用FTPClient实现文件上传和下载的实践指南

    Java利用FTPClient实现文件上传和下载的实践指南

    本文介绍如何使用Java中的FTPClient库来执行文件的上传和下载操作,首先,讲解了FTPClient的基本用法,包括连接FTP服务器和登录验证,然后,详细说明了如何使用 storeFile() 和 retrieveFile() 方法分别实现文件上传和下载,需要的朋友可以参考下
    2025-05-05
  • Java使用EasyExcel实现对excel文件的读写方式

    Java使用EasyExcel实现对excel文件的读写方式

    这篇文章主要介绍了Java使用EasyExcel实现对excel文件的读写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 详解JAVA中priorityqueue的具体使用

    详解JAVA中priorityqueue的具体使用

    这篇文章主要介绍了详解JAVA中priorityqueue的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Java实现简易图书借阅系统

    Java实现简易图书借阅系统

    这篇文章主要为大家详细介绍了Java实现简易图书借阅系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Java中byte[]、String、Hex字符串等转换的方法

    Java中byte[]、String、Hex字符串等转换的方法

    这篇文章主要介绍了Java中byte[]、String、Hex字符串等转换的方法,代码很简单,需要的朋友可以参考下
    2018-05-05
  • Java设计模式中单一职责原则详解

    Java设计模式中单一职责原则详解

    这篇文章主要介绍了Java设计模式中单一职责原则详解,单一职责原则 (SRP) 是软件设计中的一个重要原则,它要求每个类只负责一个职责,需要的朋友可以参考下
    2023-05-05
  • java中Servlet Cookie取不到值原因解决办法

    java中Servlet Cookie取不到值原因解决办法

    这篇文章主要介绍了java中Servlet Cookie取不到值原因解决办法的相关资料,需要的朋友可以参考下
    2017-06-06
  • Java中的HttpServletRequestWrapper用法解析

    Java中的HttpServletRequestWrapper用法解析

    这篇文章主要介绍了Java中的HttpServletRequestWrapper用法解析,HttpServletRequest 对参数值的获取实际调的是org.apache.catalina.connector.Request,没有提供对应的set方法修改属性,所以不能对前端传来的参数进行修改,需要的朋友可以参考下
    2024-01-01

最新评论