我有一个HttpSessionListener。有没有一种方法,在其sessionDestroyed方法中区分以下情况:
- 由于超过了web.xml中配置的
session-timeout
,会话被销毁 - 该会话被调用HttpSession#invalide的应用程序以编程方式销毁
我的用例是,我在多个应用程序之间有一个单一登录(SSO)安排,并且当参与SSO安排的一个应用程序显式注销时,我希望全局单一注销,但当其会话超时时则不希望,因此需要区分这两种情况。我想一种方法是应用程序在调用HttpSession#invalide之前在会话对象中设置一些标志。HttpSessionListener随后会检查会话对象,如果找到该标志,它就会知道这是一次编程注销。如果不是,那就是容器注销。这有意义吗?或者有更好的方法吗?
您可以使用HttpSession#getLastAccessedTime()
来获取与会话关联的客户端发送的最后一个请求的时间戳。然后,您可以在HttpSession#getMaxInactiveInterval()
和当前时间戳的帮助下进行计算。
long lastAccessedTime = session.getLastAccessedTime();
long timeoutInMillis = TimeUnit.SECONDS.toMillis(session.getMaxInactiveInterval());
long now = System.currentTimeMillis();
boolean sessionHasBeenTimedout = (now - timeoutInMillis > lastAccessedTime);
// ...