调用HttpServletRequest.getSession(boolean create)
会导致会话的上次访问时间更新吗?那么getId()
方法甚至是getLastaccessedtime()
呢?简而言之,访问导致HttpSession
更新的getLastAccessedTime
的标准是什么
答案 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)
调用将更新访问时间:
当前Session
尚未缓存在Request
中且请求的会话管理器能够将会话ID映射到有效的Session
,或
当create
为true
且创建Session
时。
目前尚不清楚方案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()
答案 2 :(得分:0)
来自Servlet规范:
在 当作为会话的一部分的请求是第一个时,认为会话被访问 由servlet容器处理。
这会立即排除会话中的所有方法,因为您必须识别会话以将请求与其关联,并且如果它创建新会话或首先将请求与请求关联,则它在getSession(boolean)
中进行规则会话。