当前位置: 首页 > web >正文

Java SapringBoot集成Redis存储Session,setAttribute会重置过期时间吗?怎么实现更新过期时间

目录

      • 手动更新过期时间
      • 自定义 `HttpSessionListener`
      • 自定义 `RedisOperationsSessionRepository`

在 Spring Boot 集成 Redis 存储 Session 的场景下,调用 setAttribute 方法本身不会重置 Session 的过期时间。Session 的过期时间主要由以下配置决定:

  • server.servlet.session.timeout 配置:这是 Spring Boot 提供的通用配置项,用于设置 Session 的超时时间,单位为秒。

如果希望在每次调用 setAttribute 时重置 Session 的过期时间,可以通过以下方式实现:

手动更新过期时间

在调用 setAttribute 后,获取当前 Session 的剩余过期时间,并重新设置该过期时间。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpSession;@RestController
public class SessionController {@GetMapping("/setSessionAttribute")public String setSessionAttribute() {HttpSession session = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getSession();session.setAttribute("key", "value");session.setMaxInactiveInterval(1800); // 设置新的过期时间(秒)return "Session attribute set and timeout updated";}
}

自定义 HttpSessionListener

实现 HttpSessionListener,在监听到 Session 属性变更事件时,重置过期时间。

import org.springframework.stereotype.Component;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;@Component
public class SessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {}@Overridepublic void attributeAdded(HttpSessionBindingEvent event) {event.getSession().setMaxInactiveInterval(1800); // 设置新的过期时间(秒)}@Overridepublic void attributeRemoved(HttpSessionBindingEvent event) {}@Overridepublic void attributeReplaced(HttpSessionBindingEvent event) {event.getSession().setMaxInactiveInterval(1800); // 设置新的过期时间(秒)}
}

自定义 RedisOperationsSessionRepository

自定义 RedisOperationsSessionRepository,在保存 Session 时更新过期时间。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;@Configuration
@EnableRedisHttpSession
public class RedisConfig {@Value("${server.session.timeout}")private int sessionTimeout = 1800;@Beanpublic RedisOperationsSessionRepository sessionRepository(RedisConnectionFactory connectionFactory) {RedisOperationsSessionRepository repository = new RedisOperationsSessionRepository(connectionFactory);repository.setDefaultMaxInactiveInterval(sessionTimeout);return repository;}
}

通过以上方法,可以在调用 setAttribute 时重置 Session 的过期时间。

http://www.xdnf.cn/news/9397.html

相关文章:

  • Soft thinking和MixtureofInputs——大模型隐空间推理——本周论文速读
  • apk- 反编译apktools操作方法——请勿乱用-东方仙盟
  • Opigno LMS 3.2.7 安装操作记录
  • 32通道采集收发平台18G带宽直采
  • lcd-framebuffer驱动开发参考文章
  • 更新时间相差8个小时
  • Word 目录自动换行后错位与页码对齐问题解决教程
  • 某验4无感探针-js逆向
  • fabric 是一个开源框架,用于使用 AI 增强人类能力。它提供了一个模块化框架,用于使用一组可在任何地方使用的众包人工智能提示来解决特定问题
  • 仿真环境中机器人抓取与操作——感知与抓取
  • 通过实例来讲解MySQL锁机制
  • 智能的结构化觉醒:GraphRAG引领AI进入关系世界
  • JDK21深度解密 Day 6:ZGC与内存管理进化
  • Flink Table API 编程入门实践
  • 使用子查询在 SQL Server 中进行数据操作
  • 触觉智能RK3506星闪开发板规格书 型号IDO-EVB3506-V1
  • 如何在sublime text中批量为每一行开头或者结尾添加删除指定内容
  • 计算机系统结构-第4章-数据级并行
  • 五大要素协同效益的量化模型与实战策略
  • 企业宣传网站系统项目
  • Unity3D仿星露谷物语开发54之退出菜单及创建可执行文件
  • 视频监控联网系统GB28181协议中历史视音频的回放流程详解以及查询失败常见原因
  • Python PyMySQL
  • 为什么共现矩阵是高维稀疏的
  • 【笔记】解决ImportError: cannot import name ‘interp‘ from ‘scipy‘报错
  • Jenkins实践(7):Publish over SSH功能
  • 大模型的多显卡训练实现涉及分布式计算框架。实现方式附代码
  • 二叉树part03(二)
  • 计算机组成原理——指令格式
  • Silvaco TCAD 2020 Windows版本安装教程