码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 如何实现token续期——双token实现


    我们知道token的失效时间,是在创建时就规定的时间,如果时间一到,用户即使任然在操作,那么也会强制退出,体验非常不好,本文介绍token续期的常见方式之一双token。


    目录

    一、核心思路

    二、实现步骤

    1、在登录成功时就生成并返回双token

    2、添加拦截器,进行token续期或者其他操作


    一、核心思路

    1. if(token有效){
    2. if(token没有过期){
    3. //放行
    4. }else{
    5. //token过期,验证refresh
    6. if(refresh没有过期){
    7. //续期生成双token,放行
    8. }else{
    9. //两个token都过期,拦截
    10. }
    11. }
    12. }else{
    13. //token无效,拦截
    14. }

    二、实现步骤

    1、在登录成功时就生成并返回双token

    1. @PostMapping("/login")
    2. public Object login(@RequestBody AdminDto adminDto, HttpServletResponse response){
    3. //登录时验证码判断
    4. if(!adminDto.getCode().equals(redisTemplate.opsForValue().get(adminDto.getUuid()))) {
    5. throw new LoginCodeException();
    6. }
    7. Admin loginAdmin = adminService.login(adminDto);
    8. //这里不用判断是因为,在service层已经作出判断并抛出异常了
    9. //创建token
    10. String token = JwtUtil.createToken(loginAdmin.getAid().toString(), loginAdmin.getUsername());
    11. String refresh = JwtUtil.createRefreshToken(loginAdmin.getAid().toString(), loginAdmin.getUsername());
    12. //token存储请求头
    13. response.setHeader("token", token);
    14. response.setHeader("refresh", refresh);
    15. //前后端分离程序,后端必须暴露响应头,前端才能获取
    16. // response.setHeader("Access-Control-Expose-Headers", "token, refreshToken");
    17. //记录Session
    18. return R.ok(null).setMsg("登录成功").setCode(200);
    19. }

    2、添加拦截器,进行token续期或者其他操作

    1. @Slf4j
    2. @Component
    3. public class LoginInterceptor implements HandlerInterceptor {
    4. @Autowired
    5. RoleService roleService;
    6. @Override
    7. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    8. if (request.getMethod().equals("OPTIONS")) {
    9. return true;
    10. }
    11. String token = request.getHeader("token");
    12. String refresh = request.getHeader("refresh");
    13. if (JwtUtil.validate(token) == true) {
    14. if (JwtUtil.isExpire(token) == true) {
    15. return true;
    16. }else {
    17. if (JwtUtil.isExpire(refresh) == true) {
    18. //创建token
    19. token = JwtUtil.createToken(JwtUtil.getId(token), JwtUtil.getUsername(token));
    20. refresh = JwtUtil.createRefreshToken(JwtUtil.getId(token), JwtUtil.getUsername(token));
    21. //token存储请求头
    22. response.setHeader("token", token);
    23. response.setHeader("refresh", refresh);
    24. return true;
    25. } else {
    26. ObjectMapper objectMapper = new ObjectMapper();
    27. String s = objectMapper.writeValueAsString(R.failed("登录失败").setCode(401));
    28. PrintWriter writer = response.getWriter();
    29. writer.write(s);
    30. return false;
    31. }
    32. }
    33. } else {
    34. ObjectMapper objectMapper = new ObjectMapper();
    35. String s = objectMapper.writeValueAsString(R.failed("登录失败").setCode(401));
    36. PrintWriter writer = response.getWriter();
    37. writer.write(s);
    38. return false;
    39. }
    40. }
    41. }

    还有一种token+redis的方式,思路类似,只不过在创建长token时,是直接存入redis,由redis中取出是否为空,判断此次登录是否续期。

  • 相关阅读:
    Oracle Primavera Unifier uDesigner 资产管理器(Asset Manager )
    java计算机毕业设计Vue和mysql智能图书管理系统MyBatis+系统+LW文档+源码+调试部署
    如何使用 MATLAB 数学编程软件调用 Python 脚本详细教程(每周更新中)
    redis非关系型数据库
    玩家最关心的绝地求生游戏作战干货大揭秘,助你击败敌人登顶王者!
    携职教育:“涉税信息查询结果告知书”如何查询?
    深度神经网络模型有哪些,深度神经网络预测模型
    分布式限流不会用?一个注解简单搞定
    idea工具中maven的Lifecycle功能讲解
    idea 插件 checkstyle 规则示例和说明
  • 原文地址:https://blog.csdn.net/TaloyerG/article/details/134003346
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号