清理过期 Session
在上面的代码,我们并没有看到太多的过期处理,只是调用了 sessions[i].isValid(),原来清理动作都在这个方法里面处理的,相当的隐晦。在 StandardSession#isValid() 方法中,如果 now - thisAccessedTime >= maxInactiveInterval 则判定当前 Session 过期了,而这个 thisAccessedTime 参数在每次访问都会进行更新
public boolean isValid() {
// other code......
// 如果指定了最大不活跃时间,才会进行清理,这个时间是 Context.getSessionTimeout(),默认是30分钟
if (maxInactiveInterval > 0) {
int timeIdle = (int) (getIdleTimeInternal() / 1000L);
if (timeIdle >= maxInactiveInterval) {
expire(true);
}
}
return this.isValid;
而 expire 方法处理的逻辑较繁锁,下面我用伪代码简单地描述下核心的逻辑,由于这个步骤可能会有多线程进行操作,因此使用 synchronized 对当前 Session 对象加锁,还做了双重校验,避免重复处理过期 Session。它还会向 Container 容器发出事件通知,还会调用 HttpSessionListener 进行事件通知,这个也就是我们 web 应用开发的 HttpSessionListener 了。由

本文深入剖析了Tomcat中Session的清理逻辑,包括如何判断并处理过期Session,以及在HttpSessionListener中的操作。在Session过期时,Tomcat通过HttpSessionBindingListener进行事件通知,并确保并发安全性。同时,分析了Session时间戳的更新机制,确保每次请求都能更新Session的鲜活时间。最后,探讨了Session创建时的事件通知,指出其在设置id时触发LifecycleListener的过程。
最低0.47元/天 解锁文章
4005

被折叠的 条评论
为什么被折叠?



