• 如何实现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中取出是否为空,判断此次登录是否续期。

  • 相关阅读:
    【分布式系统】分布式选举之Bully算法
    如何上传服务器代码到GitHub上,并更新
    销量上不去?跨境电商出现这5种迹象,你需要Starday了!
    PMP每日一练 | 考试不迷路-8.17(包含敏捷+多选)
    c#特性 --- 委托(delegate)与 异常处理
    Java—Set
    SpringCloud Gateway 自定义Filter用代码怎么写?别再说我只会配置基本Filter了,来学学如何定制Filter过滤器
    论文阅读笔记 | 三维目标检测——3DSSD
    LaTeX中的数学公式
    [附源码]java毕业设计停车场收费管理系统
  • 原文地址:https://blog.csdn.net/TaloyerG/article/details/134003346