【问题标题】:Control Vaadin Heart beats控制 Vaadin 心跳
【发布时间】:2016-02-29 06:51:23
【问题描述】:

有没有一种方法可以控制何时停止向服务器发送心跳?

我的要求是,当用户在文本框中键入内容或将鼠标指针悬停在 UI 上时,UI 不会过期。

当然,当用户在页面上执行某些活动时,我们可以使用一些 java 脚本 hack 来发送一些服务器请求,这最终会阻止 UI 过期。

但我更希望通过心跳来控制它,如果用户真的远离 UI,则在超时后停止发送心跳,但在用户输入时继续发送心跳(以定义的速率)文本框或鼠标悬停。

最好的处理方法是什么?

【问题讨论】:

  • UI 是否应该过期?如果没有,那么您可以使用推送机制来防止 UI 过期
  • 不,如果用户完全不活动,我希望 UI 过期

标签: javascript java vaadin vaadin7


【解决方案1】:

我了解,只要有用户输入,您就希望您的 UI 保持活跃。如果用户处于空闲状态,则应删除 UI,而不是被心跳阻塞。

您可以通过禁用心跳机制来做到这一点。将参数closeIdleSession 设置为true 即可。 在你的 web.xml 中写:

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

如果用户在指定的超时时间内没有触发请求,则会话无效。这样,您的 UI 会在会话超时到期后被销毁。会话超时设置在 web.xml 中通过

<session-config>
    <session-timeout>60</session-timeout><!-- in minutes -->
</session-config>

通过在您的文本字段中添加TextChangeListener,输入将发送请求并自动刷新服务器超时。

【讨论】:

  • 您在前两行中的断言是绝对正确的,但所描述的解决方案不是我所期望的。许多视图中有许多文本框,为每个视图添加一个TextChangeListener 是多余的。我只需要一些连接到心跳客户端 API 的钩子,如果 UI 上没有任何用户活动会抑制心跳,那么 UI 将自动过期。我相信这是可能的,因为心跳和在 UI 上检测用户活动都是 Java 脚本。
  • 我承认,如果用户只是键入并悬停在控件上,但实际上并未向服务器提交任何表单输入,则该解决方案可能对您不起作用。假设您的会话超时为 60 分钟,而用户只是将鼠标悬停在 UI 上并输入,但在此期间从不按 Enter 或任何按钮,他们最终将面临会话超时。但这真的适合您的应用吗?
  • 这是一个边缘场景。目前看来,用户在输入一些难以填写的表格时会出现会话超时。
  • 我明白了,如果您将文本字段默认设置为即时模式 (setImmediate(true)) 会怎样?您可以使用文本字段的工厂方法轻松完成此操作。然后每次用户离开文本字段的焦点时,都会向服务器发送一个请求。如果您将值更改侦听器附加到文本字段,则该字段隐式处于立即模式,您不必设置它。
  • 设置 immediate true 会在一定程度上起到作用。但是要求苛刻的 QAS 将像书呆子一样对其进行测试,对于他们来说,当应用程序即将超时或用户在悬停鼠标时思考时,用户在文本框中输入的情况不会被覆盖。所以你是说我们没有任何选项可以挂接到心跳 Api 并抑制或继续发送心跳并以这种方式控制超时?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
相关资源
最近更新 更多