通过JavaScript纯粹检测浏览器中用户的不活动状态

28

构建一个监视器,可以监控用户在浏览器上的任何活动,如单击按钮或在文本框中输入(不是鼠标悬停在文档上)。因此,如果用户长时间没有活动,会话将超时。

我们需要在没有jQuery或其他任何东西的情况下完成。我可能会使用ajax,首选Java servlet。


1
你是在进行Ajax请求吗?还是有什么原因导致会话无法自动超时? - Christofer Eliasson
会话超时间隔将在web.xml文件中(在Java应用程序中)设置。我们可以进行Ajax调用(目的我不知道,很可能是为了使会话失效)。如果用户闲置时间超过web.xml中指定的时间间隔,则会弹出消息提醒您已超时! - Ranjan Sarma
以下所选答案来自于StackOverflow的这个回答:https://dev59.com/KWkw5IYBdhLWcg3w6ewb#28847156。 - Sanjay
1
我更喜欢这个问题,因为它没有提到IE浏览器。 - Xan-Kun Clark-Davis
1个回答

6
你所建议的方法存在问题,即使用户在移动鼠标或输入文本,会话也会超时。因此,如果将会话超时设置为20分钟,并且用户持续输入了21分钟,则会话仍然会超时,即使他们一直处于“活跃”状态。唯一能防止会话超时的是向服务器发出新的请求。
解决方案1:让服务器控制会话超时
除非你在后台进行Ajax请求来不断更新会话,否则可以在页面加载时设置JavaScript超时并以此方式提醒用户。除非在用户停留在你的页面时有其他请求发送到服务器,否则没有必要使其变得复杂。
setTimeout(function () {
   alert("You've timed out baby!");
}, 1200000); // 20 minutes in millisec (modify to your session timeout)

如果用户访问另一页或重新加载页面,则会更新会话并重置JavaScript计时器。如果用户没有这样做,会话将在用户收到警报的同时超时。
解决方案2:让客户端控制会话超时
如果您希望JavaScript完全控制会话持续时间,以便每当用户输入、移动鼠标或其他操作时都会更新会话,那么您需要在后台向服务器进行Ajax请求,以便更新会话。(可以是一个空的虚拟请求,只要有东西访问服务器即可)
然后,您需要跟踪所有您认为是“用户活动”的操作(AnhSirk在他的答案中提出了一种方法),并在发生此类事件时重置超时计时器。如果用户长时间不活动,则需要向服务器上的某个页面发出Ajax请求,使其无效,并提示用户会话已超时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接