探索《How Tomcat Works》心得 七 Session

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值