要求容器在Java中会话即将超时时通知您的应用程序

时间:2009-10-08 12:54:19

标签: java session timeout containers

当会话即将超时时,可以使用哪种方法让容器通知您的应用程序?(选择所有适用的方法)

一个。 HttpSessionListener.sessionDestroyed - 正确

B中。 HttpSessionBindingListener.valueBound

℃。 HttpSessionBindingListener.valueUnbound - 更正这是一种圆形但是如果你有一个属性类,这是一种通知超时的方法

d。 HttpSessionBindingEvent.sessionDestroyed - 没有这样的方法

电子。 HttpSessionAttributeListener.attributeRemoved - 删除属性与会话超时没有紧密关联

F。 HttpSessionActivationListener.sessionWillPassivate - 会话钝化不同于超时

我同意选项A.

1)但是C值得怀疑

如何将未绑定值与会话超时紧密耦合。这只是删除属性时的回调方法。

2)如果C是正确的,E也应该是正确的。

HttpSessionAttributeListener只是一个想知道何时在会话中添加,删除或替换任何类型的属性的类。它由任何类实现。

HttpSessionBindingListener存在,以便属性本身可以找出何时添加到会话或从会话中删除,属性类必须实现此接口才能实现它。

任何想法......

1 个答案:

答案 0 :(得分:0)

我对此问题的解决方案是使用A.请记住,在会话失效之前调用HttpSessionListener.sessionDestroyed(),因此其所有属性都是完整的。

我们的应用程序使用带有键"LOGOUT"的会话属性来表示显式注销。所以你的代码看起来像这样:

public void sessionDestroyed(HttpSessionEvent se) {
    Object logout = se.getSession().getAttribute("LOGOUT");
    String username = (String)se.getSession().getAttribute("USERNAME");
    auditLog.info("User '" + username + "' " +
                 (logout == null ? "timed" : "logged") +
                 " out.");
}

据我所知,没有标准方法可以告诉HttpSession它为什么要失效,令人惊讶的是,HttpSessionEvent对象中没有任何信息可以描述事件是(直到Java EE 6为止)。