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