会话超时判断需基于准确记录的时间戳而非简单相减,应记录会话起始或最后访问时间,实时比对当前时间与阈值,并支持滑动超时及线程安全更新,同时规避时钟不同步、int溢出等陷阱。
会话超时判断不能只靠 System.currentTimeMillis() 简单相减,关键在于合理记录和比较时间戳,同时兼顾业务逻辑与系统稳定性。
每次用户成功登录或创建会话时,必须立即记录当前毫秒时间戳作为会话开始时间:
ConcurrentHashMap<String, Long>)或分布式存储(如 Redis)中,键为会话 ID,值为 System.currentTimeMillis()
HttpSession,可通过 session.getCreationTime() 获取初始时间,它底层也基于 currentTimeMillis()
每次用户发起操作(如接口调用、页面刷新),需实时校验是否超时:
long now = System.currentTimeMillis();
long startTime
long elapsed = now - startTime;
30 * 60 * 1000L)比较,elapsed > timeoutMs 即判定超时多数场景需要用户持续操作则延长会话,而非固定截止时间:
System.currentTimeMillis()
now - lastAccessTime > timeoutMs
System.currentTimeMillis() 本身可靠,但误用会导致逻辑错误:
currentTimeMillis()——虽开销极小,但无意义重复调用影响可读性long
new Date(ts).toString()),方便排查问题不复杂但容易忽略细节,核心就是“一次记录、多次比对、适时更新”。