在 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 {
@Override
public void sessionCreated(HttpSessionEvent se) {}
@Override
public void sessionDestroyed(HttpSessionEvent se) {}
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
event.getSession().setMaxInactiveInterval(1800); // 设置新的过期时间(秒)
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {}
@Override
public 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;
@Bean
public RedisOperationsSessionRepository sessionRepository(RedisConnectionFactory connectionFactory) {
RedisOperationsSessionRepository repository = new RedisOperationsSessionRepository(connectionFactory);
repository.setDefaultMaxInactiveInterval(sessionTimeout);
return repository;
}
}
通过以上方法,可以在调用 setAttribute
时重置 Session 的过期时间。