当会话被视为访问时

时间:2016-01-01 01:16:41

标签: java session servlets

调用HttpServletRequest.getSession(boolean create)会导致会话的上次访问时间更新吗?那么getId()方法甚至是getLastaccessedtime()呢?简而言之,访问导致HttpSession更新的getLastAccessedTime的标准是什么

3 个答案:

答案 0 :(得分:3)

Tomcat javadoc说:

  

“返回客户端最后一次发送与此会话关联的请求,作为格林尼治标准时间1970年1月1日午夜以来的毫秒数,并标记为容器收到请求的时间。

     

您的应用程序采取的操作(例如获取或设置与会话关联的值)不会影响访问时间。

所以,根据javadoc的说法,你的问题的答案是(应该):

  

问:调用HttpServletRequest.getSession(boolean create)会导致会话的最后访问时间更新吗?

答:根据javadoc,没有(但见下文)

  

问:getId()方法甚至调用getLastaccessedtime()怎么样?

答:没有。

  

问:简而言之,访问HttpSession导致getLastAccessedTime更新的标准是什么。

答:见上文。它记录上次客户端请求的时间。

请注意,实际行为可能取决于Servlet的实现。例如,根据Tomcat 7源代码(7.0.39.2),getSession(boolean)调用更新访问时间:

  1. 当前Session尚未缓存在Request中且请求的会话管理器能够将会话ID映射到有效的Session,或

  2. createtrue且创建Session时。

  3. 目前尚不清楚方案1是否实际发生在来自应用程序代码的调用中,但方案2当然可以。这意味着创建Session计为“访问”......这是有道理的。

答案 1 :(得分:2)

这很大程度上取决于服务器的实现和配置。就像tomcat在源代码中设置是否在请求到达时或在发送响应之前设置lastAccessedTime

看看Tomcat 7的源代码答案是

HttpServletRequest.getSession(boolean create)更新lastAccessedTime?

getId()更新lastAccessedTime?

getLastaccessedtime()更新lastAccessedTime?

Tomcat正在使用access()中的org.apache.catalina.session.StandardSession方法更新lastAccessedTime。

以下是access()方法的源代码

/**
 * Update the accessed time information for this session.  This method
 * should be called by the context when a request comes in for a particular
 * session, even if the application does not reference it.
 */
@Override
public void access() {

    this.thisAccessedTime = System.currentTimeMillis();

    if (ACTIVITY_CHECK) {
        accessCount.incrementAndGet();
    }

}

HTTPServletRequest实现Tomcat类org.apache.catalina.connector.Request的{​​{1}}方法中调用此方法。简单的getSession(boolean create)调用也是如此。

以下是getSession()

的调用层次结构的屏幕截图

enter image description here

答案 2 :(得分:0)

来自Servlet规范:

  

在   当作为会话的一部分的请求是第一个时,认为会话被访问   由servlet容器处理。

这会立即排除会话中的所有方法,因为您必须识别会话以将请求与其关联,并且如果它创建新会话或首先将请求与请求关联,则它在getSession(boolean)中进行规则会话。