【问题标题】:distinguish between session timeout and session explicit (programmatic) invalidation区分会话超时和会话显式(程序化)失效
【发布时间】:2018-04-20 06:22:57
【问题描述】:

我有一个HttpSessionListener。有没有办法,在其sessionDestroyed 方法中区分以下情况:

  • 会话被破坏,因为超出了 web.xml 中配置的session-timeout
  • 会话被调用HttpSession#invalidate的应用程序以编程方式销毁

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

【问题讨论】:

    标签: servlets httpsession


    【解决方案1】:

    您可以使用HttpSession#getLastAccessedTime() 获取与会话关联的客户端发送的最后一个请求的时间戳。然后,您可以在 HttpSession#getMaxInactiveInterval() 和当前时间戳的帮助下进行数学运算。

    long lastAccessedTime = session.getLastAccessedTime();
    long timeoutInMillis = TimeUnit.SECONDS.toMillis(session.getMaxInactiveInterval());
    long now = System.currentTimeMillis();
    
    boolean sessionHasBeenTimedout = (now - timeoutInMillis > lastAccessedTime);
    // ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多