我有一个HttpSessionListener 。有没有办法,在其sessionDestroyed里面区分以下情况的方法:
- 由于超出了 web.xml 中配置的
session-timeout
, session 被销毁 - 应用程序调用 HttpSession#invalidate 以编程方式销毁 session
我的用例是,我在多个应用程序之间进行了单点登录 (SSO) 安排,并且当参与 SSO 安排的应用程序之一明确注销时(但不是在其 session 时间时),我希望进行全局单点注销出,因此需要区分这两种情况。我想应用程序的一种方法是在调用 HttpSession#invalidate 之前在 session 对象中设置一些标志。 。 HttpSessionListener然后将检查 session 对象,如果找到该标志,它就会知道这是一个编程注销。如果没有,那就是容器注销。这有意义和/或有更好的方法吗?
最佳答案
您可以使用HttpSession#getLastAccessedTime()
获取与 session 关联的客户端发送的最后一个请求的时间戳。然后你可以在 HttpSession#getMaxInactiveInterval()
的帮助下进行数学计算和当前时间戳。
long lastAccessedTime = session.getLastAccessedTime();
long timeoutInMillis = TimeUnit.SECONDS.toMillis(session.getMaxInactiveInterval());
long now = System.currentTimeMillis();
boolean sessionHasBeenTimedout = (now - timeoutInMillis > lastAccessedTime);
// ...
关于servlets - 区分 session 超时和 session 显式(编程)失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47164896/