Tomcat从零开始(十二)Session第一部分

来源:互联网 发布:淘粉吧是淘宝授权的吗 编辑:程序博客网 时间:2024/05/29 17:52

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的时候不会直接传一个HttpRequestBaserequest,而是传递一个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。

原创粉丝点击