从 HttpSession 对象获取过期信息
Get expiring from HttpSession object
我正在尝试从 HttpSessionListener 捕获 sessionDestroyed 事件,以检查是否由 sessionTimeout 触发。
在调试时,我可以看到一个名为 "expiring" 的属性,根据文档,该属性用于在内部跳过一些异常。
expiring
We are currently processing a session expiration, so bypass certain IllegalStateException tests.
Source
问题是 ,因为此属性设置为 "protected" 我无法检查此事件是否由会话超时有效触发。
我需要捕获此会话超时事件以在数据库中保存一条记录。
有人可以帮助我吗?
这是我目前拥有的:
public class AppHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
LOG.log(Level.INFO, "DEBUG: SESION DESTRUIDA");
}
private static final Logger LOG = Logger.getLogger(AppHttpSessionListener.class.getName());
}
在 HTTP 协议中,当客户端不再活动时,没有明确的终止信号。这意味着可用于指示客户端何时不再活动的唯一机制是超时期限。
会话的默认超时时间由servlet容器定义,可以通过HttpSession接口的getMaxInactiveInterval方法获取。开发人员可以使用 HttpSession 接口的 setMaxInactiveInterval 方法更改此超时。这些方法使用的超时时间以秒为单位定义。根据定义,如果会话的超时期限设置为 -1,则该会话将永不过期。直到所有使用该会话的 servlet 都退出服务方法后,会话失效才会生效。一旦发起会话失效,新的请求一定不能看到那个会话。
HttpSession 接口的 getLastAccessedTime 方法允许 servlet 确定在当前请求之前最后一次访问会话的时间。当作为会话一部分的请求首先由 servlet 容器处理时,会话被视为已访问。
或许你可以试试估计一下?
@Override
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession httpSession = se.getSession();
long lastAccessedTime = httpSession.getLastAccessedTime();
int maxInactiveTime = httpSession.getMaxInactiveInterval();
if ((System.currentTimeMillis() - lastAccessedTime) >= (maxInactiveTime*1000) {
LOG.log(Level.INFO, "DEBUG: SESION DESTRUIDA");
}
我正在尝试从 HttpSessionListener 捕获 sessionDestroyed 事件,以检查是否由 sessionTimeout 触发。
在调试时,我可以看到一个名为 "expiring" 的属性,根据文档,该属性用于在内部跳过一些异常。
expiring We are currently processing a session expiration, so bypass certain IllegalStateException tests. Source
问题是 ,因为此属性设置为 "protected" 我无法检查此事件是否由会话超时有效触发。
我需要捕获此会话超时事件以在数据库中保存一条记录。
有人可以帮助我吗?
这是我目前拥有的:
public class AppHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
LOG.log(Level.INFO, "DEBUG: SESION DESTRUIDA");
}
private static final Logger LOG = Logger.getLogger(AppHttpSessionListener.class.getName());
}
在 HTTP 协议中,当客户端不再活动时,没有明确的终止信号。这意味着可用于指示客户端何时不再活动的唯一机制是超时期限。
会话的默认超时时间由servlet容器定义,可以通过HttpSession接口的getMaxInactiveInterval方法获取。开发人员可以使用 HttpSession 接口的 setMaxInactiveInterval 方法更改此超时。这些方法使用的超时时间以秒为单位定义。根据定义,如果会话的超时期限设置为 -1,则该会话将永不过期。直到所有使用该会话的 servlet 都退出服务方法后,会话失效才会生效。一旦发起会话失效,新的请求一定不能看到那个会话。
HttpSession 接口的 getLastAccessedTime 方法允许 servlet 确定在当前请求之前最后一次访问会话的时间。当作为会话一部分的请求首先由 servlet 容器处理时,会话被视为已访问。
或许你可以试试估计一下?
@Override
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession httpSession = se.getSession();
long lastAccessedTime = httpSession.getLastAccessedTime();
int maxInactiveTime = httpSession.getMaxInactiveInterval();
if ((System.currentTimeMillis() - lastAccessedTime) >= (maxInactiveTime*1000) {
LOG.log(Level.INFO, "DEBUG: SESION DESTRUIDA");
}