servlets - 区分 session 超时和 session 显式(编程)失效

标签 servlets httpsession

我有一个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/

相关文章:

jsp - Servlet/JSP MVC 模式如何转换为 JSF/Facelets(特别是服务和 Controller 部分)?

java - 将<error-page>添加到不带web.xml的特定servlet

jsp - servlet结果显示在jsp页面

java - 优雅地检查 HTTPSession 引用是否仍然有效

tomcat - Coldfusion 10 Servlet 问题

java - Servlet 请求的资源不会被缓存

Java HttpSession setattribute 在 qa 上抛出不可序列化的异常,但在本地环境中没有

java - 将不可序列化的属性值设置到 HttpSession 中

session - JSESSIONID 后缀的用途是什么?

java - HttpSessionListener.sessionCreated() 未被调用