【发布时间】:2015-11-21 12:54:30
【问题描述】:
在尝试在 30 秒不活动后在浏览器端实现自动注销时,我们考虑创建一个 /heartbeat 端点:
- 当用户移动鼠标或键入任何键时,会在 10 秒后安排一个 javascript 回调,以调用
PUT /heartbeat。 - 如果已安排回调,则取消前一个回调 - 这样做是为了避免当用户连续键入和/或移动鼠标(例如写入内容时)时
PUT /heartbeat的“雪崩”。 - 然后,每 60 秒发出一个
GET /heartbeat- 检查自上次“更新”该用户会话以来经过了多少时间。我们可以通过检查烧杯会话表的内容来做到这一点。如果超过 30 分钟,端点会向 Javascript 返回一个适当的指示,因此用户会自动在浏览器中注销。
这可以正常工作,除了一个小缺陷 - GET /heartbeat 更新烧杯会话时间戳...
所以,问题是 - 在 Pyramid/Beaker 下,有没有办法创建一个不更新会话时间戳的端点?
【问题讨论】:
-
如果已经安排了回调,则取消前一个回调这样,如果用户连续执行某些操作,您将永远不会收到心跳...
-
@Piotr:如果用户正在做某事,那么后端会因为他的行为而被调用,所以他的会话保持活动状态。
-
(...) 这样做是为了避免在用户连续键入和/或移动鼠标时出现
PUT /heartbeat的“雪崩”用户只是在打字,更不用说移动鼠标了? -
:-) 不,当然不是。关键是用户可能会做一些涉及后端的事情(这意味着烧杯/金字塔将标记会话并且它仍然存在)或者他可能正在我们的文档编辑器中编写(不调用后端,所以他的会话可能过期。心跳用于指示用户还活着,即使他还没有调用后端(还 - 保存他的更改)。现在有意义吗?如果他写/移动鼠标,10秒后心跳将被发送,保持会话活动。我们不希望在每次鼠标移动/击键时都这样做,因此会限制