session工作过程

当每个jsp请求tomcat的时候,都会将session id以cookie的形式发送给服务器,由服务器来处理该session id。session在服务器中是以一个HashMap的形式来保存的。request接收到session后会执行doGetSession()方法,该方法会返回一个session,将接收到的session和服务器端的session进行对比,判断该session是否有效,若session失效,将重新创建一个session返回(若是jsp第一次访问该服务器没有session,也通过该方法创建一个session),若session有效,则返回该session。其中在执行doGetSession()的时候会通过
 

        Session session = null;
        try {
            session = manager.findSession(requestedSessionId);
        } catch (IOException e) {
            // Can't find the session
        }

方法来得到请求id的session。但是该方法在得到session后并不会检查session是否有效,这样就可能导致一些问题,例如当能得到session(不为null)但是该session又过期的时候。这是因为该方法会执行access()方法重置最后连接时间,因此会导致以后检查session失效的时候都是按照这个重置后的时间来计算的。

在判断session时经常出现的

        if ((session != null) && !session.isValid()) {
            return null;
        }

判断句就是tomcat对失效session的处理。

isValid()方法:

    /**
     * Return the <code>isValid</code> flag for this session.
     */
    @Override
    public boolean isValid() {

        if (!this.isValid) {
            return false;
        }

        if (this.expiring) {
            return true;
        }

        if (ACTIVITY_CHECK && accessCount.get() > 0) {
            return true;
        }

        if (maxInactiveInterval > 0) {
            int timeIdle = (int) (getIdleTimeInternal() / 1000L);
            if (timeIdle >= maxInactiveInterval) {
                expire(true);
            }
        }

        return this.isValid;
    }

可以看到有一个expire()方法,这就是进行过期处理的方法。该方法会将失效的session给移除:

同时tomcat还对session每隔一个时间间隔进行一次检查。在catalina.core.ContainerBase下添加了一个ContainerBackgroundProcessor implements Runnable用于定期执行一系列方法。当然检查session的方法也最终会在这里被调用。但是现在,最后发现在catalina.session.ManagerBase下有这样一段代码:

@Override

public void backgroundProcess() {

count = (count + 1) % processExpiresFrequency;

if (count == 0)

processExpires();

}

在这里定义了定期检查session,并移除过期session。这里需要注意一下processExpiresFrequency,可以看到调用processExpires()进行过期检查的时间是与processExpiresFrequency的值有关的,默认情况下processExpiresFrequency为6,所以默认每执行6次backgroundProcess()进行一次检查。

tomcat官方对processExpiresFrequency有如下说明:

Frequency of the session expiration, and related manager operations. Manager operations will be done once for the specified amount of backgroundProcess calls (i.e., the lower the amount, the more often the checks will occur). The minimum value is 1, and the default value is 6.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值