登录逻辑

    /*** 登录验证* * @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
{@Autowiredprivate TokenService tokenService;@Overrideprotected 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的登录认证。

RuoYi-Vue项目登录过期的实现相关推荐

  1. vue项目登录页-实现字体动画案例

    vue项目登录页-实现字体动画案例 实现思路: 1,让每个字都包含在span标签中,span标签的display:inner-block 2,页面刚生成时(动画之前)设置margin宽度为80px,o ...

  2. vue项目token过期

    问题:vue项目token过期,后端会在token过期之前两秒钟在控制台的返给前端一个新的authorization(token) token过期分析:1.jwt过期(其中一个过期)===> 后 ...

  3. vue项目登录及token验证 vue-ant

    在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下: 1.第一次登录的时候,前端调后端的登陆接口,发送用户名和密码 2.后端收到请求,验证用户名和密码,验证成功,就给前端返回一个to ...

  4. vue项目登录页背景图百分百铺满屏幕宽高自适应

    vue项目背景图百分百铺满屏幕宽高自适应 .login{background: url(../../../static/img/login/beijing@2x.png);background-siz ...

  5. Vue项目登录成功后返回到原操作页面

    登录超时或者由于其它原因,造成必须重新登录的情况,相信大家都见过这种场景,比较偷懒的办法是登陆成功厚直接回到主页面,但其实我们有更好的解决办法. 作为vue的标配,我们可以利用axios的全局拦截器做 ...

  6. vue项目实现登录(sessionStorage 存储 token)

    前提参考:vue项目封装axios 思路: // 1, 前端校验,校验成功后向后台传用户名和密码(每次请求接口都要传 token) // 2, 后端收到请求,验证用户名和密码,验证成功,生成 toke ...

  7. linux部署多个jar 会宕机_部署springboot+vue项目文档(若依ruoyi项目部署步骤)

    最近部署若依项目,一直部署失败,多亏有好人将这篇文章相赠,特地分享出来供大家学习参考,希望大家共同进步. 一:部署linux + nginx 部署后台代码 1.1 由于本人采用的是idea工具开发,所 ...

  8. 部署springboot+vue项目文档(若依ruoyi项目部署步骤)

    部署springboot+vue项目文档(若依ruoyi项目部署步骤) 一:部署linux + nginx 二:部署windows + tomcat(无nginx) 三:解决调用第三方api如百度地图 ...

  9. Vue项目中实现用户登录及token验证

    一.什么是token token的意思是"令牌",是服务端生成的一串字符串,作为客户端进行请求的一个标识.当用户第一次登录后,服务器生成一个token并将此token返回给客户端, ...

最新文章

  1. C 指针的有意思的描述
  2. GO 跟C++/C差异
  3. 2.11 计算机视觉现状-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  4. 百度 71个炸天的开源项目,你知道几个?
  5. unity的依赖注入
  6. 开源OSS.Social微信项目解析
  7. LeetCode MySQL 1212. 查询球队积分
  8. Zigbee学习计划暂停
  9. 医院耗材管理系统开发_15
  10. android minicap web,使用minicap对安卓手机快速截屏
  11. Max Script 入门教程
  12. 5个最优秀的Java和C#代码转换工具
  13. 自动控制原理:如何用折线式伯德图计算截止频率?
  14. 数据结构与算法笔记(青岛大学王卓老师视频)
  15. 交互技术前沿学习心得——利用眼动追踪改良广告界面
  16. idea智能提示设置和修改提示快捷键
  17. 兼容微信6.74 ios12版本
  18. 芋道 Spring Boot 快速入门
  19. 成功登陆港交所,顺丰同城的“跑腿”生意好做吗?
  20. 安装sinaweibo.py

热门文章

  1. 浏览器被恶意篡改(百分百成功)
  2. python定义单位矩阵_单位矩阵与正则矩阵NumPy/Python的高效Kronecker积
  3. 基于51单片机的波形发生器(四种波形)(毕业设计资料)
  4. python 打印乘法表各种形式_Python使用while循环花式打印乘法表
  5. 西瓜视频怎么下载视频?
  6. 鲲鹏云服务器运行python项目_鲲鹏云实验-Python+Jupyter机器学习基础环境
  7. 启用计算机的无线同屏,Windows10如何使用无线同屏功能?
  8. 微信H5开发之页面布局
  9. STM32F103C8T6在Arduino IDE里编程
  10. GDAL+Basemap+IDW(反距离权重)代替ARCPY,制作温度、降雨分布图