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

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.dtcms.com/a/216512.html

相关文章:

  • Linux中Java开发、部署和运维常用命令
  • 关于Oracle SGA内存抖动
  • AGI大模型(34):Advanced RAG之Pre-Retrieval(预检索)优化
  • 5月27日星期二今日早报简报微语报早读
  • 欢乐熊大话蓝牙知识11:如何打造一个低功耗蓝牙温湿度传感器?
  • brep2seq 论文笔记
  • #RabbitMQ# 消息队列进阶
  • LabVIEW比例阀性能测试试验台
  • 开源多模态新标杆——BAGEL本地部署教程:7B参数撬动万亿数据
  • Recaf:现代字节码编辑器
  • 批量文件重命名工具
  • 竞赛小算法总结(二):gcdlcm,拓展欧几里得线性同余,逆元(含代码详解)
  • 大模型 Agent 中的通用 MCP 机制详解
  • 芯片跑post sim,在waveform中一般要check哪些点?
  • 【前端】es6新特性全解
  • Transformer 通关秘籍10:词向量运算:queen=king-man+wowem
  • WebFuture:瀚高数据库新建用户设置权限脚本
  • C++中回调函数详解
  • opencv(C++) 变换图像与形态学操作
  • 【Git】Commit Hash vs Change-Id
  • 一张Billing项目的流程图
  • opencv(C++) 图像滤波
  • AR眼镜+AI视频盒子+视频监控联网平台:消防救援的智能革命
  • FileZillaServer(1) -- 记录
  • 模型可信度
  • 详解Kubernetes Scheduler 的调度策略
  • 基于 STM32 的农村污水处理控制系统设计与实现
  • HTML 表单与输入:基础语法到核心应用全解析
  • Kotlin 实战:Android 设备语言与国家地区的 5 种获取方式
  • 说说 Kotlin 中的 Any 与 Java 中的 Object 有何异同?