区分会话超时和会话显式(编程)失效
distinguish between session timeout and session explicit (programmatic) invalidation
我有一个HttpSessionListener. Is there a way, inside its sessionDestroyed方法来区分以下情况:
- 会话被销毁,因为web.xml中配置的
session-timeout
被超过
- 会话已被调用 HttpSession#invalidate
的应用程序以编程方式销毁
我的用例是我在多个应用程序之间有单点登录 (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);
// ...
我有一个HttpSessionListener. Is there a way, inside its sessionDestroyed方法来区分以下情况:
- 会话被销毁,因为web.xml中配置的
session-timeout
被超过 - 会话已被调用 HttpSession#invalidate 的应用程序以编程方式销毁
我的用例是我在多个应用程序之间有单点登录 (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);
// ...