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的在线续期内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解读线程池-Executors的newSingleThreadExecutor和newFixedThreadPool(1)区别

    解读线程池-Executors的newSingleThreadExecutor和newFixedThreadPool(1

    这篇文章主要介绍了解读线程池-Executors的newSingleThreadExecutor和newFixedThreadPool(1)区别,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java中char数组(字符数组)与字符串String类型的转换方法

    Java中char数组(字符数组)与字符串String类型的转换方法

    这篇文章主要介绍了Java中char数组(字符数组)与字符串String类型的转换方法,涉及Java中toCharArray与valueOf方法的使用技巧,需要的朋友可以参考下
    2015-12-12
  • log4j2.xml文件详解及在日志中加入全局guid

    log4j2.xml文件详解及在日志中加入全局guid

    这篇文章主要介绍了log4j2.xml文件详解及在日志中加入全局guid,基于很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java IO和NIO的基本概念和API详解

    Java IO和NIO的基本概念和API详解

    JavaIO是基于流的阻塞式I/O,适用于低并发场景;JavaNIO是基于通道和缓冲区的非阻塞式I/O,适用于高并发场景
    2025-03-03
  • Java中Calendar类的一些常用方法小结

    Java中Calendar类的一些常用方法小结

    项目当中,我们经常会涉及到对时间的处理,Date类最主要的作用就是获得当前时间,同时这个类里面也具有设置时间以及一些其他的功能,但更推荐使用 Calendar 类进行时间和日期的处理,这篇文章主要给大家介绍了关于Java中Calendar类的一些常用方法,需要的朋友可以参考下
    2021-11-11
  • 浅谈Java中Properties类的详细使用

    浅谈Java中Properties类的详细使用

    properties类继承自hashtable,通常和io流结合使用。它最突出的特点是将key/value作为配置属性写入到配置文件中以实现配置持久化,或从配置文件中读取这些属性。它的这些配置文件的规范后缀名为".properties"。表示了一个持久的属性集
    2021-06-06
  • Java中MapStruct对象映射的实现

    Java中MapStruct对象映射的实现

    MapStruct是一种Java实体类映射框架,本文就来介绍一下Java中MapStruct对象映射的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-12-12
  • 从基础转换与高级设置详解Java中PDF转换为Excel的完整指南

    从基础转换与高级设置详解Java中PDF转换为Excel的完整指南

    将 PDF 转换为 Excel 是一个常见需求,本文将展示如何使用 Java 将 PDF 文件转换为 Excel,并提供自定义设置以优化复杂 PDF 的转换效果,感兴趣的小伙伴了解一下
    2026-03-03
  • FutureTask为何单个任务仅执行一次原理解析

    FutureTask为何单个任务仅执行一次原理解析

    这篇文章主要为大家介绍了FutureTask为何单个任务仅执行一次原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • java使用Hashtable过滤数组中重复值的方法

    java使用Hashtable过滤数组中重复值的方法

    这篇文章主要介绍了java使用Hashtable过滤数组中重复值的方法,涉及java数组遍历及过滤的相关技巧,需要的朋友可以参考下
    2016-08-08

最新评论