【问题标题】:Session timeout does't work vaadin会话超时不起作用
【发布时间】:2014-12-05 08:18:15
【问题描述】:

我正在开发一个 vaadin Web 应用程序,并在我的 web.xml 中添加了以下 sn-p 代码。

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

现在我注意到我的用户在 30 分钟后也可以使用该应用程序,但我不希望这样。我在 vaadin 的书上读到了一些关于这个问题的东西,但我并没有解开一些东西。

来自 vaadin 书:

用户不活动后会话超时

在正常的 servlet 操作中,会话超时定义了允许的 服务器应该清理会话的不活动时间。 不活动是从最后一个服务器请求开始测量的。不同的 servlet 容器使用不同的超时默认值,例如 30 Apache Tomcat 的分钟数。您可以在下设置超时 与:

在 web.xml 中:

<session-config>
   <session-timeout>30</session-timeout> 
  </session-config>

会话超时应长于心跳间隔或 否则会话在心跳可以保持之前关闭 活。由于会话到期使 UI 处于它们的状态 假设会话仍然存在,这将导致不同步 浏览器中的错误通知。

但是,心跳间隔比会话超时更短, 这是正常情况,可防止会话过期。如果 servlet 的 closeIdleSessions 参数已启用(由 默认),Vaadin 会在该时间后关闭 UI 和会话 session-timeout 参数中指定的最后一个过期时间 非心跳请求。

在 web.xml 中:

<servlet>
...
<init-param>
  <param-name>closeIdleSessions</param-name>
  <param-value>true</param-value>
</init-param>

现在我认为问题在于我的应用程序服务器让 UI 处于他们认为会话仍然存在的状态,但我无法理解什么是心跳? closeSessionId 究竟做了什么?

【问题讨论】:

  • 为了测试给它 1 分钟并检查它是否正常工作。

标签: java session servlets vaadin vaadin7


【解决方案1】:

心跳表示客户端仍然存在。 例如当用户关闭浏览器时,客户端无法再发送心跳, 服务器检测到这一点并清理服务器端的 UI。 默认情况下,这会使会话永远保持活动状态。 因此,如果这不是您必须在 web.xml 中设置的预期行为:

<init-param>
    <description>Enable Session Timeout</description>
    <param-name>closeIdleSessions</param-name>
    <param-value>true</param-value>
</init-param>

【讨论】:

  • 如果我理解,如果客户端关闭浏览器没有发送心跳,然后服务器无法确定何时关闭会话?
  • @Skizzo 我认为如果客户端关闭浏览器,那么会话将在 30 分钟后过期。但是,如果客户端保持打开浏览器几个小时,则默认情况下会话保持活动状态。如果您将closeIdleSessions 设置为true,则会话将在30 分钟后过期,即使浏览器仍处于打开状态(当然也没有用户活动)。
  • 我觉得这个话题真的很有趣,如果在 Vaadin 的书上说The inactivity is measured from the last server request,那么如果浏览器在用户关闭浏览器时服务器如何检测到会话处于非活动状态不再发送请求(因为它已关闭)???服务器是否使用了事件循环之类的,并触发了一个事件,表明它不再接收来自客户端的请求?
猜你喜欢
  • 2016-01-21
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多