RuoYi-Vue项目登录过期的实现

2023-11-14

登录逻辑

    /**
     * 登录验证
     * 
     * @param username 用户名
     * @param password 密码
     * @param code 验证码
     * @param uuid 唯一标识
     * @return 结果
     */
    public String login(String username, String password, String code, String uuid)
    {
        //删掉了无关的验证代码
        return tokenService.createToken(loginUser);
    }

最后返回token,就是浏览器存储在Cookie中的令牌,以后每次请求都会带上。

    /**
     * 创建令牌
     *
     * @param loginUser 用户信息
     * @return 令牌
     */
    public String createToken(LoginUser loginUser)
    {
        String token = IdUtils.fastUUID();
        loginUser.setToken(token);
        setUserAgent(loginUser);
        refreshToken(loginUser);

        Map<String, Object> claims = new HashMap<>();
        claims.put(Constants.LOGIN_USER_KEY, token);
        return createToken(claims);
    }

createToken方法首先生成一个uuid,作为登录用户唯一标识,setUserAgent()方法用于装填LoginUser类中User-Agent信息,看下方法refreshToken方法

    /**
     * 刷新令牌有效期
     *
     * @param loginUser 登录信息
     */
    public void refreshToken(LoginUser loginUser)
    {
        loginUser.setLoginTime(System.currentTimeMillis());
        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
        // 根据uuid将loginUser缓存
        String userKey = getTokenKey(loginUser.getToken());
        redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
    }

设置登录时间,利用redis缓存LoginUser对象,并设置过期时间,使用前面生成的用户唯一标识作为key(拼接了固定字符串作为前缀)。

最后就是使用用户唯一标识来生成token并返回给浏览器。

刷新缓存的逻辑

直接在项目中搜索前文中的refreshToken方法

可以看到以下方法

    /**
     * 验证令牌有效期,相差不足20分钟,自动刷新缓存
     *
     * @param loginUser
     * @return 令牌
     */
    public void verifyToken(LoginUser loginUser)
    {
        long expireTime = loginUser.getExpireTime();
        long currentTime = System.currentTimeMillis();
        if (expireTime - currentTime <= MILLIS_MINUTE_TEN)
        {
            refreshToken(loginUser);
        }
    }

继续搜索,

/**
 * token过滤器 验证token有效性
 * 
 * @author ruoyi
 */
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
{
    @Autowired
    private TokenService tokenService;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException
    {
        LoginUser loginUser = tokenService.getLoginUser(request);
        if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication()))
        {
            tokenService.verifyToken(loginUser);
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
            authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
            SecurityContextHolder.getContext().setAuthentication(authenticationToken);
        }
        chain.doFilter(request, response);
    }
}

可以看到就是在登录验证的过滤器中进行缓存刷新,看下getLoginUser方法

    /**
     * 获取用户身份信息
     *
     * @return 用户信息
     */
    public LoginUser getLoginUser(HttpServletRequest request)
    {
        // 获取请求携带的令牌
        String token = getToken(request);
        if (StringUtils.isNotEmpty(token))
        {
            try
            {
                Claims claims = parseToken(token);
                // 解析对应的权限以及用户信息
                String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
                String userKey = getTokenKey(uuid);
                LoginUser user = redisCache.getCacheObject(userKey);
                return user;
            }
            catch (Exception e)
            {
            }
        }
        return null;
    }

首先,获取Cookie中携带的令牌,解析出uuid,即前文redis缓存用户信息的key(拼接了前缀),获取存储的LoginUser,接下来调用verifyToken方法执行刷新逻辑,接下来的代码是spring security的登录认证。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RuoYi-Vue项目登录过期的实现 的相关文章

随机推荐

  • 多目标跟踪笔迹十三:Learning by tracking Siamese CNN for robust target association

    1 Introduce 本文介绍了一种在行人跟踪背景下处理数据关联任务的新方法 引入了一种两阶段学习方案去匹配 检测对 首先 对 Siamese 卷积神经网络 CNN 进行了训练 以学习描述两个输入图像块之间的局部时空结构 聚合像素值和光流
  • 安装Ambari 2.7.5 + HDP3.1.5(附安装包)

    目录 前置准备 1 安装包准备 2 服务器配置 3 配置静态IP 4 配置主机名 5 关闭防火墙及selinux 6 配置ssh互信 7 安装pssh工具 非必须 8 配置ntp时钟同步 9 设置swap 10 关闭透明大页面 11 安装h
  • ubuntu创建自己的git远程仓库

    准备工作 先弄来一个服务器 可以先自行租赁一个服务器例如华为云 阿里云 腾讯云等等 这些服务器都可以哪个便宜就选择哪个吧 然后安装一个ubuntu的系统 这边我自用的是ubuntu系统 其他的系统没用搭建过 如果是Linux的系统大致都一样
  • 人工智能汇总---政策-应用--技术

    2017 8 2018 6月 那些脑袋迷糊的日子 不知啥是人工智能 接下来一步一步去了解 从大政策 到媒体 企业 学校 自己动手 逐步对人工智能有个初步的了解 下面对精华网址汇总 供有共同爱好的学习 讨论群 366244662 2017 8
  • VASP输入INCAR文件

    欢迎来到我的博客 坚持比努力重要 文章目录 欢迎来到我的博客 坚持比努力重要 目录 VASP输入INCAR文件 初始I O设置 读入 读出 Electronic Relaxation 电子步 Ionic Relaxation 离子步 Pol
  • Arduino使用Esp32-cam开发版

    首先你需要先准备一些硬件 1 Esp32 Cam开发版 2 TY OV2640 v2 0摄像头 3 烧录底座 可以用USB TTL 我用的是Esp8266的烧录底座 4 杜邦线母线x5 颜色不做要求 开始填坑 贴个大佬的玩法 如果你在开发版
  • 获取outputstream大小_java从输入流中获取数据并返回字节数组示例

    代码如下 import java io ByteArrayOutputStream import java io InputStream 从输入流中获取数据并以字节数组返回 public class StreamTool 从输入流获取数据
  • 神州网信政府版win10远程

    今天去客户公司部署系统 本来想着开好远程后马上回来远程操作 哪知道客户服务器安装的是 神州网信政府版win10远程 遇到一堆问题 处理了半天 记录下 1 参考 Windows10神州网信版的远程桌面开启 神州网信 远程桌面 dawn的博客
  • Using the SG3525 PWM Controller - Explanation and Example: Circuit Diagram / Schematic of Push-Pull

    5 Using the SG3525 PWM Controller Explanation and Example Circuit Diagram Schematic of Push Pull Converter PWM is used i
  • 【前端】Vue项目:旅游App-(1)搭建项目、重置css、配置router和store(pinia)

    文章目录 创建项目 搭建和配置项目 项目目录结构划分 重置CSS normalize css reset css 目录结构 配置router 对应页面组件 index js 配置store 创建项目 npm init vue latest
  • Markdown 公式编号及引用

    举一个简单的例子 前提条件是使用 mathjax 作为 LaTeX 渲染工具 Suppose we solve equations mathcal L U F tag 1 label eq1 In the equation eqref eq
  • Qt框架概述

    Qt框架概述 一 什么是Qt 二 了解QtCreator 三 创建Qt项目 Qt项目框架及文件介绍 四 设置窗口属性 五 按钮 创建按钮方式一 按钮属性设置 创建按钮方式二 六 对象模型 一 什么是Qt 概念 Qt是一个基于C 的 跨平台的
  • [指针八]有关指针的面试题

    有关指针的经典面试题 C语言为何如此长寿并实用 C 为什么有那么多精彩 指针可以说是C C 中的灵魂所在 虽然早期中pascal也有指针 但是和C C 比起来不是一个级别的 今天为大家深入浅出的解析一下指针的有关笔试 面试题 所有题目来源网
  • 十三、Redis——最佳实践(Redis时参考的经验总结)

    目录 1 Redis健值设计 1 1 优雅的key结构 1 2 拒绝BigKey 1 2 1 BigKey的危害 1 2 2 如何发现BigKey 1 2 3 如何删除BigKey 1 3 恰当的数据类型 编辑 总结 2 批处理优化 2 1
  • R语言第五次实训,dplyr 、tidyr和lubridate处理数据

    题目1 1 数据处理 只用SY 20150401 csv 将数据处理成每条数据处于一天中的第几个5分钟 说明 00 00 01在第一个5分钟内 00 10 13 在第三个5分钟内 由于一天可能多次乘坐地铁 根据卡号和进站时间 查询最近出站的
  • 软复位与硬复位

    软复位与硬复位 1 软复位与硬复位 软复位信号名称中通常包含soft 硬复位信号名称中通常包含hard 软复位 常用于复位逻辑模块 硬复位 常用于配置寄存器模块 配置信号同步模块 硬复位有效会驱动软复位有效 一个模块出现问题时 可以使其软复
  • 物联网实训总结——简易的智能农场

    物联网实训总结 简易的智能农场 一 场景需求 1 农场环境监测 对农场的环境实现智能感知 对温度 湿度 光照值实时显示 同时检测农场烟雾状态 判断火情 实时监控农场人员出现情况 2 控制管理 智能农场控制部分分为 通风系统和补光系统 实现对
  • PAT Basic Level 1002 写出这个数

    import java util Scanner author djch date 2021 5 21 public class Main public static void main String args Scanner scanne
  • 多目录CMAKE文件的编写

    前言 对于单文件来说一个CMakeLists txt文件即可 但是大多数项目的文件都不可能只有一个文件 因此介绍下在多目录下CMakeLists xtx文件是如何编写的 思考 对于多目录CMAKE文件的编写应该怎样写呢 我们知道单目录文件只
  • RuoYi-Vue项目登录过期的实现

    登录逻辑 登录验证 param username 用户名 param password 密码 param code 验证码 param uuid 唯一标识 return 结果 public String login String usern