《how tomcat work》 搬运工 Chapter 9: Session Management
Catalina版本的Tomcat通过manager板块来提供session管理,manager通常是和context联系在一起,就是context类里会有一个manager实例。
Session interface
public interface Session { public static final String SESSION_CREATED_EVENT = "createSession"; public static final String SESSION_DESTROYED_EVENT = "destroySession"; public String getAuthType(); public void setAuthType(String authType); public long getCreationTime(); public void setCreationTime(long time); public String getId(); public void setId(String id); public String getInfo(); public long getLastAccessedTime(); public Manager getManager(); public void setManager(Manager manager); public int getMaxInactiveInterval(); public void setMaxInactiveInterval(int interval); public void setNew(boolean isNew); public Principal getPrincipal(); public void setPrincipal(Principal principal); public HttpSession getSession(); public void setValid(boolean isValid); public boolean isValid(); public void access(); public void addSessionListener(SessionListener listener); public void expire(); public Object getNote(String name); public Iterator getNoteNames(); public void recycle(); public void removeNote(String name); public void removeSessionListener(SessionListener listener); public void setNote(String name, Object value); }
常用到的HttpSession就是要继承Session接口的。而session的实例都在manager里管理。
一、Manager
manager最基本的功能就是保存session,用hashmap来保存,删除,
manager interface
public interface Manager { public Container getContainer(); public void setContainer(Container container); public DefaultContext getDefaultContext(); public void setDefaultContext(DefaultContext defaultContext); public boolean getDistributable(); public void setDistributable(boolean distributable); public String getInfo(); public int getMaxInactiveInterval(); public void setMaxInactiveInterval(int interval); public void add(Session session); public void addPropertyChangeListener(PropertyChangeListener listener); public Session createSession(); public Session findSession(String id) throws IOException; public Session[] findSessions(); public void load() throws ClassNotFoundException, IOException; public void remove(Session session); public void removePropertyChangeListener(PropertyChangeListener listener); public void unload() throws IOException; }
细分各种manager
(1)StandardManager
最常规的manager,复制保存session在内存。同样要继承,Lifecycle interface方便开始和结束。在stop时,会将通过验证的session序列化到一个文件里,在reload是就会重新读取。
同样,standardManager会销毁过期的session。
在tomcat4会通过开启一个dedicated线程。所以StandardManager会继承并实现 java.lang.Runnable接口。在一段时间后会通过processExpires()来检测session和去销毁。
在tomcat5中,会则通过
public void backgroundProcess() { processExpires(); }
来进行。这个方法是通过StandardContext的backgroundProcess方法来调用的,
(2)PersistentManager
PersistentManager继承PersistentManagerBaseh接口。
PersistentManager和StandardManager的区别是,PersistentManager会通过第二层存储来管理session,比如说在文件,数据库。
这则是通过一个私有的类,private Store store;
还可以进行back up,当服务器宕机时可以恢复session,还有swap out来将一些不活跃的session重内存里清除来节省内存。
在tomcat4中也是开启一个线程来完成这些功能。
在tomcat5则通过backgroundProcess();
(3)DistributedManager
DistributedManager是PersistentManager的子类,DistributedManager是解决session的集群管理
在Tomcat启动时中应用manager
Manager manager = new StandardManager();
context.setManager(manager);