我可以用什么来实现在Tomcat上运行的Java Servlets中为每个会话实现后台进程?

3
我希望能够定期为每个有会话的用户运行一个函数,以检查用户是否活跃。如果不活跃,则该函数将从servlet上下文中的用户列表中删除用户并清除用户会话。
我可以使用什么来定时运行该函数以针对每个用户?
据我所知,servletcontextlistener仅在servlet生命周期内运行一次,而不是针对每个用户,因此无法使用。此外,在servlet中建议不要使用线程。
编辑: 用户(使用ajax)调用包含函数的操作,该函数更新了我为每个用户存储的变量,该变量指示他们最后一次联系服务器的时间。

后台线程如何“检查用户是否活动”?通常情况下,您不会与客户端保持持久连接,因此您只能知道客户端何时发送请求。通常,通过让客户端定期发送心跳消息(例如使用AJAX)来实现您要做的事情。 - Jim Garrison
你不觉得你已经可以配置会话生命周期来实现这个功能了吗? - Thilo
会话将会过期,但当它到期时我希望能运行一个函数来从servlet上下文中删除用户变量。我不知道如何在web.xml文件的会话过期时运行一个函数。 - samwise
请不要生成另一个线程。只需监听会话销毁即可。 - BalusC
2个回答

2
您可能正在寻找javax.servlet.http.HttpSessionListener。创建一个,将其注册到web.xml中,并在sessionDestroyed中完成您的工作。

看起来很有前途。我会尝试实现它,看看能否正常工作。谢谢。 - samwise

1

我能想到的两种方法:

  1. 使用 request.getSession().setMaxInactiveInterval(someValue)

  2. 由于您正在使用ajax,因此可以发送实际的“终止会话”请求,而不是发送“用户活动”值。这意味着http调用较少,因为客户端处理用户是否活动的逻辑,而实际的“会话终止”逻辑在后端处理。因此,以下是情景:

    Javascript代码每分钟运行一次,检查用户是否活动(不确定您实际查看了什么,但这是另一回事)。如果在5分钟后用户在客户端未执行任何操作,则向后端发送ajax调用以终止会话。


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