探索《How Tomcat Works》心得 七 Session

来源:互联网 发布:单片机仿真软件怎么用 编辑:程序博客网 时间:2024/04/29 21:14

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 对象。




0 0