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

Servlets 区分会话超时和会话显式(编程)无效,servlets,httpsession,Servlets,Httpsession,我有一本书。在其方法中是否有办法区分以下情况: 由于超出了web.xml中配置的会话超时,会话被销毁 该会话被调用的应用程序以编程方式销毁 我的使用案例是,我在多个应用程序之间有一个单点登录(SSO)安排,我希望在参与SSO安排的一个应用程序显式注销时,而不是在其会话超时时,进行全局单点注销,因此需要区分这两种情况。我想一种方法是应用程序在调用之前在会话对象中设置一些标志。然后,将检查会话对象,如果找到该标志,它将知道这是编程注销。如果不是,则是容器注销。这有意义吗?或者有更好的方法吗?您可

我有一本书。在其方法中是否有办法区分以下情况:

  • 由于超出了web.xml中配置的
    会话超时
    ,会话被销毁
  • 该会话被调用的应用程序以编程方式销毁
我的使用案例是,我在多个应用程序之间有一个单点登录(SSO)安排,我希望在参与SSO安排的一个应用程序显式注销时,而不是在其会话超时时,进行全局单点注销,因此需要区分这两种情况。我想一种方法是应用程序在调用之前在会话对象中设置一些标志。然后,将检查会话对象,如果找到该标志,它将知道这是编程注销。如果不是,则是容器注销。这有意义吗?或者有更好的方法吗?

您可以使用获取与会话关联的客户端发送的最后一个请求的时间戳。然后,您可以借助于和当前时间戳进行计算

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

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