从 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");
   }