Session在连接器中被管理,在servlet程序中通过getSession中调用,它在默认连接器中由HttpRequestBase中被实现。下面介绍一下Tomcat中的HttpRequestBase类的相关方法:
HttpRequestBase类是HttpRequest接口的基本实现,满足大多数实现了Http协议的连接器所要求的Request实现,只有一些特别的方法需要被重写。获取Session的方法如下,为HttpRequest分配一个Session,如果有必要,创建一个Session。
public HttpSession getSession(boolean create) {
if( System.getSecurityManager() != null ) {
PrivilegedGetSession dp = new PrivilegedGetSession(create);
return (HttpSession)AccessController.doPrivileged(dp);
}
return doGetSession(create);
}
下面介绍下doGetSession(create)方法
private HttpSession doGetSession(boolean create) {
// There cannot be a session if no context has been assigned yet
if (context == null)
return (null);
// Return the current session if it exists and is valid
if ((session != null) && !session.isValid())
session = null;
if (session != null)
return (session.getSession());
// Return the requested session if it exists and is valid
Manager manager = null;
if (context != null)
manager = context.getManager();
if (manager == null)
return (null); // Sessions are not supported
if (requestedSessionId != null) {
try {
session = manager.findSession(requestedSessionId);
} catch (IOException e) {
session = null;
}
if ((session != null) && !session.isValid())
session = null;
if (session != null) {
return (session.getSession());
}
}
// Create a new session if requested and the response is not committed
if (!create)
return (null);
if ((context != null) && (response != null) &&
context.getCookies() &&
response.getResponse().isCommitted()) {
throw new IllegalStateException
(sm.getString("httpRequestBase.createCommitted"));
}
session = manager.createSession();
if (session != null)
return (session.getSession());
else
return (null);
}
程序比较简单,而且还有注释,此处不再多做累述啦
引用书中的话,默认情况下,管理器将session对象存储在内存中,但是Tomcat对象也允许将Session对象存储在数据库或者文件中,通过jdbc获取。Catalina在org.apache.catalina.session包中提供了session对象和session管理的相关类型。
Session相关的类的关系图如下:
Session的标准实现类StandardSession,但是为了安全起见,Catalina不会把standardSession传给用户,而是把一个外观类StandSessionFacade传给用户,这种做法与前面讲到的RequestFacade与ResponseFacade如出一辙,都是为了限制权限,而把在内部使用到的标准实现类经过包装之后,再传递给servlet中,供servlet程序员使用。StandardSession是session的标准实现类,它实现了javax的HttpSession接口和Session接口,供Catalina内部使用,同时session被管理器管理,管理器控制它的生成,删除。
管理器
管理器用来管理 Session 对象。在运行的时候,StandardManager 将 session 对象存放在内存中。但是,当停止的时候,它将 Session 对象存放到文件中。当它再次启动的时候,重新载入Session 对象。