您的位置:首页 > 运维架构 > Tomcat

《how tomcat work》 搬运工 Chapter 9: Session Management

2015-09-06 10:58 651 查看
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里管理。

[b]一、Manager[/b]

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的集群管理

[b]在Tomcat启动时中应用manager[/b]

Manager manager = new StandardManager();

context.setManager(manager);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: