Tomcat从零开始(十二)Session第一部分
Session这个东西相信有过web开发经验的都不是很陌生,我们今天就说说session的管理。它是依靠org.apache.catalina.Manager这个接口来进行管理的。我们先来看看其中定义的方法。
我们可以看见他有get/setContainer()方法,所以可以断定它一定与上下文的容器机型的关联,同时他有一个方法createSession() remove(Session) findSession(String)这几个方法。这里先不多说,我们先来想想我们一般在servlet中是如何获取一个session的。就是request.getSession()就完事了,那就可以推断出,getSession()是在javax.servlet.http.HttpServletRequest中定义的,在org.apache.catalina.connector.HttpRequestBase中实现的.
经过了这么长时间的学习,我们应该能猜到一个现象,就是 tomcat中的组件,比如request,它是由javax.servlet.http.HttpServletRequest表示的,但是传递给servlet的时候不会直接传一个HttpRequestBase的request,而是传递一个HttpRequestFacade类。所以这次的session同样也不能例外,我们能从org.apache.catalina.session找到session的标准实现StandardSession类。所以肯定有一个包装的StandardSessionFacade类。So,我们应该大概的明白这几个类的关系了。
顺便说一句session不是什么时候都存储在内存中的,它还可以被持久化到本地文件或者数据库中,一般这叫session的钝化。http://wenku.baidu.com/view/87af2827ccbff121dd368308这里就说明了为了要进行session钝化以及常用的方法。
既然我们这次说session,那么我们先来看看session的接口定义了哪些方法。
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);}
我们应该知道session一定要与Manager关联,所以我们能拿看见get/setManager(),之后我们发现 他还有一个ID的属性,这是标识session的,来确定到底是哪个session。之后就是说说失效时间,当一个Session对象被访问的时候,access方法被调用,会更新session的最后访问时间(setLastAccessedTime),同时Session的最后一次访问时间,然后拿来与一个设定的时间X做比较,从而确定session是否失效。时间X就是我们在server.xml中设置的session-timeout标签项。
妥了,接下来就是StandardSession了,它实现了Session与HttpSession接口,同时还实现了serializable,这是为了实现钝化,还有就是为了应对集群。StandardSession类中的getSession()返回的不是StandardSession对象,而是一个StandardSessionFacade对象,这是为了安全,在第request那里说过了。当session过期后,用expire方法将session设置为无效。Expire方法主要做以下几件事情:
(1)将Session设置为无效,通过setValid(false)就可以了。
(2)将session从manager中删除
(3)把session中存储的数据删除
(4)看参数来判断是否触发一些事件。
今天就到这里,session的 部分介绍完了,下节课介绍session的管理以及store。