【问题标题】:What's the best way to handle a session timeout?处理会话超时的最佳方法是什么?
【发布时间】:2013-08-02 15:12:19
【问题描述】:

我正在处理一个 JSP-Web-Application 并在会话到期时遇到麻烦。 如放置在 web.xml 中一样,超时是在 30 分钟后定义的。但我想在用户保持窗口打开期间保持会话处于活动状态。 我首先想到了一个简单的 AJAX 组件,它每 10 分钟向服务器说一次“你好”,并且可能会向数据库发送一个简单的测试语句(例如“选择 1”)。

但有两件事让我对此感到怀疑:

  1. 如果我将一个简单的 setTimeout(sayHi(),600) 放入一个无休止的 while-JS 循环中,这是一个有效且明智的决定吗?
  2. 这个概念是个好主意吗?

系统的所有用户共享一个到数据库的共用池 BoneCP 连接,以从数据库执行短查询。还有几个数据行是通过 Hibernate 获取的。 Hibernate 部分是整个应用程序中最容易出错的部分,超时后,这些集合也需要重新加载。有没有办法让 Hibernate-Session 也保持活跃?

感谢您的帮助!

【问题讨论】:

  • 在我看来你正在做的事情适得其反:一方面,你想限制时间跨度,用户必须研究网站做任何他想做的事情,另一方面延长这个限制是人为的。为什么不简单地将超时时间增加到 2 小时就完成了?
  • 1) 如果它适得其反,请给我一个更好的建议,这就是我所要求的。 2) 如果有人离开 2 小时 1 分钟,此解决方案将毫无用处 3) Ray Wadkins 提供的解决方案具有很大的副作用,可以在用户未注销的情况下进行适当的会话管理
  • 你应该问自己:我为什么要超时。从字面上看,你的超时不是超时,当没有时间点时,时间真的到了。

标签: javascript hibernate jsp tomcat7 bonecp


【解决方案1】:

我只能谈谈超时问题。无休止的 while-JS 循环不起作用,因为浏览器中的 javascript 在单个线程中运行,循环将阻止所有其他活动,从而有效地冻结您的页面。

window 对象的setInterval 方法将按照您定义的时间间隔定期执行一个动作(半)

setInterval(sayHi, 600000)

将导致 sayHi 在 10 分钟(600000 毫秒)后尽快运行。但在此期间将允许其他操作。

(另请注意,我从您的 sayHi 中删除了括号。sayHi() 将立即解决,这不是您想要的。)

【讨论】:

  • 听起来不错,到目前为止,这就是我正在寻找的功能。由于 JS 无法处理线程,超时会搞砸一切。谢谢!你知道保持 Hibernate 还活着可能需要什么吗?
  • 还有一种使用 setTimeout 的方法。但这是一个不必要的复杂关卡,所以我没有提到它。不幸的是,我不是 Java 开发人员,所以在服务器端我根本帮不了你。
猜你喜欢
  • 2011-03-19
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 2010-09-06
  • 2010-09-11
  • 1970-01-01
相关资源
最近更新 更多