区分会话超时和会话显式(程序)失效

时间:2017-11-07 18:20:14

标签: servlets httpsession

我有HttpSessionListener。有没有办法,在sessionDestroyed方法中区分以下情况:

  • 会话被销毁,因为超出了web.xml中配置的session-timeout
  • 会话被调用HttpSession#invalidate
  • 的应用程序以编程方式销毁

我的用例是我在许多应用程序之间进行单点登录(SSO)安排,当参与SSO安排的其中一个应用程序明确注销而不是其会话时间时,我希望全局单点注销因此需要区分这两种情况。我想一种方法是让应用程序在调用HttpSession#invalidate之前在会话对象中设置一些标志。然后HttpSessionListener将检查会话对象,如果找到该标志,它将知道这是一个程序化注销。如果没有,那就是集装箱注销。这是否有意义和/或是否有更好的方法?

1 个答案:

答案 0 :(得分:2)

您可以使用HttpSession#getLastAccessedTime()获取与会话关联的客户端发送的最后一个请求的时间戳。然后你可以在HttpSession#getMaxInactiveInterval()和当前时间戳的帮助下进行数学计算。

long lastAccessedTime = session.getLastAccessedTime();
long timeoutInMillis = TimeUnit.SECONDS.toMillis(session.getMaxInactiveInterval());
long now = System.currentTimeMillis();

boolean sessionHasBeenTimedout = (now - timeoutInMillis > lastAccessedTime);
// ...