Shiro 框架中如何更新Redis的超时登录时间?

在Shiro框架中,可以通过实现SessionDAO接口来将会话信息保存到Redis中,并且可以通过实现SessionValidationScheduler接口来定期检查会话是否过期。因此,要更新Redis中的超时登录时间,可以按照以下步骤进行操作:

  • 实现SessionDAO接口,将会话信息保存到Redis中。在实现SessionDAO接口时,可以使用Redis的EXPIRE命令来设置会话的过期时间。具体的实现方式取决于你使用的Redis客户端库。

  • 实现SessionValidationScheduler接口,定期检查会话是否过期。在实现SessionValidationScheduler接口时,可以使用Redis的TTL命令来获取会话的剩余过期时间,然后根据剩余过期时间来判断会话是否过期。如果会话已经过期,则可以将其从Redis中删除。

public class RedisSessionDAO implements SessionDAO {private RedisTemplate<String, Object> redisTemplate;@Overridepublic void update(Session session) throws UnknownSessionException {// 将会话信息保存到Redis中redisTemplate.opsForValue().set(session.getId(), session);// 设置会话的过期时间redisTemplate.expire(session.getId(), session.getTimeout(), TimeUnit.MILLISECONDS);}
}public class RedisSessionValidationScheduler implements SessionValidationScheduler {private RedisTemplate<String, Object> redisTemplate;@Overridepublic void enableSessionValidation() {// 定期检查会话是否过期while (true) {Set<String> sessionIds = redisTemplate.keys("shiro:session:*");for (String sessionId : sessionIds) {Long ttl = redisTemplate.getExpire(sessionId, TimeUnit.SECONDS);if (ttl != null && ttl <= 0) {redisTemplate.delete(sessionId);}}try {Thread.sleep(60000); // 每分钟检查一次} catch (InterruptedException e) {e.printStackTrace();}}}
}

SecurityUtils.getSubject().getSession().setTimeout(TimeValue);里边设置默认的Session过期时间,但是redis中 redisTemplate.opsForValue().set(SESSION_PREFIX+session.getId(),session,DEFAULT_TIME_OUT, TimeUnit.MINUTES);中的DEFAULT_TIME_OUT如何与TimeValue同步更新?

在Shiro框架中,SecurityUtils.getSubject().getSession().setTimeout(TimeValue)方法用于设置当前用户的会话过期时间,而redisTemplate.opsForValue().set(SESSION_PREFIX+session.getId(),session,DEFAULT_TIME_OUT, TimeUnit.MINUTES)方法用于将会话信息保存到Redis中,并设置会话的过期时间。为了保持这两个过期时间的同步更新,可以在SessionDAO的实现类中进行处理。

具体来说,可以在SessionDAO的实现类中定义一个常量,用于表示会话的默认过期时间。然后,在实现SessionDAO接口的create(Session session)方法和update(Session session)方法中,分别使用SecurityUtils.getSubject().getSession().getTimeout()方法获取当前用户的会话过期时间,和定义的常量进行比较,取较小值作为会话的过期时间。具体的实现方式如下:

public class RedisSessionDAO implements SessionDAO {private RedisTemplate<String, Object> redisTemplate;private static final long DEFAULT_EXPIRE_TIME = 30; // 默认过期时间,单位为分钟@Overridepublic Serializable create(Session session) {// 获取当前用户的会话过期时间long expireTime = session.getTimeout() / 1000; // 转换为秒if (expireTime > DEFAULT_EXPIRE_TIME * 60) {expireTime = DEFAULT_EXPIRE_TIME * 60;}// 将会话信息保存到Redis中,并设置过期时间redisTemplate.opsForValue().set(SESSION_PREFIX + session.getId(), session, expireTime, TimeUnit.SECONDS);return session.getId();}@Overridepublic void update(Session session) throws UnknownSessionException {// 获取当前用户的会话过期时间long expireTime = session.getTimeout() / 1000; // 转换为秒if (expireTime > DEFAULT_EXPIRE_TIME * 60) {expireTime = DEFAULT_EXPIRE_TIME * 60;}// 将会话信息保存到Redis中,并设置过期时间redisTemplate.opsForValue().set(SESSION_PREFIX + session.getId(), session, expireTime, TimeUnit.SECONDS);}
}

在上述代码中,DEFAULT_EXPIRE_TIME表示会话的默认过期时间,单位为分钟。在create(Session session)方法和update(Session session)方法中,首先使用session.getTimeout()方法获取当前用户的会话过期时间,然后将其转换为秒,并与DEFAULT_EXPIRE_TIME * 60进行比较,取较小值作为会话的过期时间。最后,将会话信息保存到Redis中,并设置过期时间为计算出的会话过期时间。这样,就可以保持会话过期时间的同步更新了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+Vue会员制医疗预约服务管理信息系统(Java毕业设计)

点击咨询源码 大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的…

RT-Thread 工程创建(1)

方式一&#xff0c; 利用已经有的bsp进行创建 距离BearPi IOT Std 板 1. 下载 RT-Thread 官方 Env工具a. 下载 [Env 工具下载](https://www.rt-thread.org/download.html#download-rt-thread-env-tool) &#xff0c; 并解压缩b. 将env注册到系统中, 这样就在右键菜单中出现&am…

PHP案例:探究MySQL应用开发喜好的网络调查

文章目录 一、知识准备(一)数据库与表的创建(二)录入调查选项(三)创建问卷页面(四)处理投票数据(五)显示调查结果二、实现步骤(一)创建数据库与表(二)录入若干调查选项(三)创建问卷页面(四)创建调查结果页面(五)体验运行结果(六)查看最终生成的HTML代码很…

Java - 线程间的通信方式

线程通信的方式 线程中通信是指多个线程之间通过某种机制进行协调和交互 线程通信主要可以分为三种方式&#xff0c;分别为共享内存、消息传递和管道流。每种方式有不同的方法来实现 共享内存&#xff1a;线程之间共享程序的公共状态&#xff0c;线程之间通过读-写内存中的公…

前端知识笔记(四十五)———前端开发与后端开发有什么区别

前端开发和后端开发是Web开发中的两个关键领域&#xff0c;它们负责不同的任务和功能。下面是前端开发和后端开发之间的主要区别&#xff1a; 前端开发&#xff1a; 用户界面&#xff1a;前端开发主要关注用户界面的开发&#xff0c;包括网页的布局、样式、交互等方面。前端技…

Android集成科大讯飞语音识别与语音唤醒简易封装

目录 一、语音唤醒部分 1、首先在科大讯飞官网注册开发者账号 2、配置唤醒词然后下载sdk 3、选择对应功能下载 4、语音唤醒lib包全部复制到工程目录下 5、把语音唤醒词文件复制到工程的assets目录 6、复制对应权限到AndroidManifest.xml中 7、唤醒工具类封装 二、语音识…

Linux学习第46天:Linux音频驱动试验:能不能?不行也得行。

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 CAN 是目前应用非常广泛的现场总线之一&#xff0c;主要应用于汽车电子和工业领域&#xff0c;尤其是汽车 领域&#xff0c;汽车上大量的传感器与模块都是通过 C…

十二、MapReduce概述

1、MapReduce &#xff08;1&#xff09;采用框架 MapReduce是“分散——>汇总”模式的分布式计算框架&#xff0c;可供开发人员进行相应计算 &#xff08;2&#xff09;编程接口&#xff1a; ~Map ~Reduce 其中&#xff0c;Map功能接口提供了“分散”的功能&#xff…

【Java期末复习资料】(1)知识点总结

本文章主要是知识点&#xff0c;后续会出模拟卷 以下是选择、填空可能考的知识点&#xff0c;多看几遍&#xff0c;混个眼熟 面向对象程序设计的基本特征是&#xff1a;抽象、封装、继承、多态&#xff08;后三个是三大特性&#xff09;Java源文件的扩缀名是.java编译Java App…

知识笔记(五十三)———MySQL 删除数据表

MySQL中删除数据表是非常容易操作的&#xff0c;但是你在进行删除表操作时要非常小心&#xff0c;因为执行删除命令后所有数据都会消失。 语法 以下为删除 MySQL 数据表的通用语法&#xff1a; DROP TABLE table_name ; -- 直接删除表&#xff0c;不检查是否存在 或 DROP…

neuq-acm预备队训练week 8 P8794 [蓝桥杯 2022 国 A] 环境治理

题目描述 输入格式 输出格式 输出一行包含一个整数表示答案。 输入输出样例 解题思路 最短路二分 AC代码 #include<bits/stdc.h> using namespace std; long long temp,n, Q; long long f[105][105],min_f[105][105],cut[105],dis[105][105];//cut为减少多少&#x…

宝塔面板部署Apache服务器搭建本地站点发布到公网可访问【内网穿透】

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家…

最短循环节问题 和 最短回文串(kmp , HASH )

给定一个字符串 s&#xff0c;你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例 1&#xff1a; 输入&#xff1a;s "aacecaaa" 输出&#xff1a;"aaacecaaa"示例 2&#xff1a; 输入&#xff1a;s &…

Java智慧校园-中小学校园管理系统源码

智慧校园系统是通过信息化手段&#xff0c;实现对校园内各类资源的有效集成 整合和优化&#xff0c;实现资源的有效配置和充分利用&#xff0c;将校务管理过程的优化协调。为校园提供数字化教学、数字化学习、数字化科研和数字化管理。 致力于为家长和教师提供一个全方位、多层…

scripty妙用

在monorepo项目中&#xff0c;随着子模块增多&#xff0c; 每个子项目都需要配置各自的package.json,并且大同小异&#xff0c;为了进一步提高配置效率&#xff0c;引入了scripty&#xff0c;自己写脚本&#xff0c;直接就可以用哦 1、安装 npm install scripty --save-dev 2…

ARMday6作業

串口发送指令控制硬件工作 uart1.h #ifndef __UART1_H__ #define __UART1_H__ #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_uart.h" void all_led_init(); void led1_on(); void led2_on(); void led3_o…

代码随想录二刷 | 二叉树 | 110.平衡二叉树

代码随想录二刷 &#xff5c; 二叉树 &#xff5c; 110.平衡二叉树 题目描述解题思路递归迭代 代码实现递归法迭代法 题目描述 110.平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉…

EMNLP 2023 获奖论文公布,大模型、NLP等领域火爆

EMNLP是计算语言学和自然语言处理领域顶级国际会议之一&#xff0c;属于CCF B类&#xff0c;是由 ACL 下属的SIGDAT小组主办的NLP领域顶级国际会议&#xff0c;一年举办一次。相较于ACL&#xff0c;EMNLP更偏向于NLP在各个领域解决方案的学术探讨。 今年的EMNLP 2023 已于2023…

table表格table/tr/td宽度和高度的设置

关于html中table表格tr,td的⾼度和宽度 做⽹页的时候经常会遇到各种各样的问题&#xff0c;经常遇到的⼀个就是会碰到表格被内容撑开的问题。 设置table样式为 table-layout: fixed; 宽度可以了&#xff0c;但是高度会被撑高。怎么设置都不行&#xff0c;只能给这个td标签单独…

【Linux】 线程池

线程池 什么是线程池&#xff1f; 一次预先申请一批线程&#xff0c;让这批线程有任务&#xff0c;就处理任务&#xff1b;没任务&#xff0c;就处于等待状态。 为什么要有线程池&#xff1f; 以空间换时间&#xff0c;预先申请一批线程&#xff0c;当有任务到来&#xff0c;可…