tomcat session管理
最近有空看了一下tomcat 6源码里面对session管理的实现,现在写下来,以供后考,也希望能对对此感兴趣的朋友
有所提示。
?
闲话少说,先贴一下tomcat6的component层次图(此图来自tomcat doc)
? Server?????????????????????????????????????????就是一个servlet container
?????????? |
???????? Service?????????????????????????????????包含一个或多个connector的组????????
?????????? |
???????? Engine????????????????????????????????? servlet engine.最顶级的container.
?????????? |? \
?????????? |? --- Cluster --*
?????????? |
???????? Host??????????????????????????????????????第二级container
?????????? |
???????? ------
??????? /????? \
???? Cluster??? Context(1-N)?????????????第三级container.?servlet context.?也就是一个应用。
??????? |???????????? \
??????? |???????????? -- Manager?????????????? 应用的session管理器
??????? |?????????????????? \
??????? |?????????????????? -- DeltaManager
??????? |?????????????????? -- BackupManager
??????? |
???? ---------------------------
??????? |?????????????????????? \
????? Channel??????????????????? \
??? ----------------------------- \
??????? |????????????????????????? \
???? Interceptor_1 ..?????????????? \
??????? |??????????????????????????? \
???? Interceptor_N??????????????????? \
??? -----------------------------????? \
???? |????????? |???????? |???????????? \
?? Receiver??? Sender?? Membership?????? \
???????????????????????????????????????? -- Valve
???????????????????????????????????????? |????? \
???????????????????????????????????????? |?????? -- ReplicationValve
???????????????????????????????????????? |?????? -- JvmRouteBinderValve
???????????????????????????????????????? |
???????????????????????????????????????? -- LifecycleListener
???????????????????????????????????????? |
???????????????????????????????????????? -- ClusterListener
???????????????????????????????????????? |????? \
???????????????????????????????????????? |?????? -- ClusterSessionListener
???????????????????????????????????????? |?????? -- JvmRouteSessionIDBinderListener
???????????????????????????????????????? |
???????????????????????????????????????? -- Deployer
??????????????????????????????????????????????? \
???????????????????????????????????????????????? -- FarmWarDeployer
?????
OK,基本层级关系说过了,就开始分析session的管理。
1. session 的创建。
?? 更正:下面这段我理解错了。其实进一步看下来,发现其实session的创建是在每个context里面。具体的创建可以看我
?? 这篇之后的那篇文章. Session的生成实际是在调用最终处理的servlet的时候生成的。
??? session的创建的入口是在Host里面,每次request进来之后,会沿着container 的pipeline一直往下进行、
??? 处理,顺序是:engine->host->context->wrapper. 而pipeline的作用就是调用对应级别的value对
?? request和response进行处理。在StandardHostValue里面首先出现对session的调用:
?
?
? 很显然,session的有效性管理也通过session具体实现的。比如DeltaSession:
??
public void expire(boolean notify, boolean notifyCluster) { if (expiring) return; String expiredId = getIdInternal(); if(expiredId != null && manager != null && manager instanceof DeltaManager) { DeltaManager dmanager = (DeltaManager)manager; CatalinaCluster cluster = dmanager.getCluster(); ClusterMessage msg = dmanager.requestCompleted(expiredId, true); if (msg != null) { if(dmanager.doDomainReplication()) { cluster.sendClusterDomain(msg); } else { cluster.send(msg); } } } super.expire(notify); if (notifyCluster) { if (log.isDebugEnabled()) log.debug(sm.getString("deltaSession.notifying", ((ClusterManager)manager).getName(), new Boolean(isPrimarySession()), expiredId)); if ( manager instanceof DeltaManager ) { ( (DeltaManager) manager).sessionExpired(expiredId); } } }?
??? 可以看出,当session失效的时候,manager会广播这个消息。