2017-07-31 69 views
1

我试图从HttpSessionListener中捕获sessionDestroyed事件以检查是否由sessionTimeout触发。从HttpSession对象获取到期

在我调试时,我可以看到一个名为“expiring”的属性,根据文档此属性用于在内部跳过一些异常。

即将到期 我们目前正在处理会话过期,因此绕过某些IllegalStateException测试。 Source

的问题是,因为这个属性被设置为“保护”我不能检查,如果该事件是由有效会话超时触发。

我需要捕获此会话超时事件以保存数据库中的记录。

有人可以帮助我吗?

这是我到目前为止有:

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()); 

} 

回答

1

也许你可以尝试估计它?

@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"); 
    } 
+1

这正是我现在所做的!哈哈谢谢这是一个正确的答案 –

0

在HTTP协议中,并没有明确的终止信号,当客户端不再有效。这意味着,可以用来指示客户端何时不再活动的唯一机制是超时期限。

会话的默认超时时间由servlet容器定义,可以通过HttpSession接口的getMaxInactiveInterval方法获取。开发人员可以使用HttpSession界面的setMaxInactiveInterval方法更改此超时时间。这些方法使用的超时时间以秒为单位定义。根据定义,如果会话的超时期限设置为-1,则会话永远不会过期。在所有使用该会话的servlet都退出服务方法之前,会话失效才会生效。一旦会话失效启动,新的请求就不能看到该会话。

HttpSession接口的getLastAccessedTime方法允许servlet确定上次在当前请求之前访问会话的时间。当会话的一部分请求首先由servlet容器处理时,会话被认为是被访问的。

+0

谢谢!我会upvote你,但我没有足够的代表。但是,这给了我足够的线索来找到解决方案:)。 –