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 的过期时间。