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

distinguish between session timeout and session explicit (programmatic) invalidation

我有一个HttpSessionListener. Is there a way, inside its sessionDestroyed方法来区分以下情况:

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

您可以使用 HttpSession#getLastAccessedTime() to obtain the timestamp of the last request sent by the client associated with the session. Then you can just do the math with help of HttpSession#getMaxInactiveInterval() 和当前时间戳。

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

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