在聊天小程序上注销用户时出现问题

发布于 2024-10-08 10:36:09 字数 263 浏览 5 评论 0原文

我希望 Java 聊天小程序的用户在关闭浏览器窗口时自动注销。

我目前使用以下方法:

public void destroy() {
    sendLogoutMessage();
}

然而,这只在 3/4 的时间内有效(可能是由于网络延迟)。

聊天小程序 ping 服务器并在 90 秒后将它们注销(这允许它们由于任何互联网问题而重新连接) - 所以它们最终会被删除,但是我想要一种更好地捕获关闭事件的方法。

I wish for users of a Java chat applet to be automatically logged out when closing the browser window.

I currently use the following:

public void destroy() {
    sendLogoutMessage();
}

However this only works 3/4 of the time (probably due to network delays).

The chat applet pings the server and logs them out after 90 seconds (this allows them to reconnect due to any internet problems) - so they do get removed eventually, however I would like a way to better catch the close event.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我的黑色迷你裙 2024-10-15 10:36:09

我认为您的代码在 100% 的情况下不起作用,因为它是在 destroy 方法中调用的,该方法不会等待并关闭所有内容,包括打开的网络连接。因此,有时如果网络速度较慢,小程序及其输出流会在向服务器发送注销消息之前被终止。

如果我的理论是正确的,你也许可以检查一下。

  • 尝试查看服务器日志中是否收到注销命令(如果失败)。我相信你会发现命令没有到达。
  • 在客户端打开java控制台。您可能会得到 IOException 或 SocketException。我希望对异常的检查可以让您了解如何改进解决方案。

另外我建议如下。

  1. 在服务器端添加servlet会话监听器,会话过期时自动注销。
  2. 将 HTTP 会话的生存时间减少到合理的数字。 JBoss 的默认值为 20 分钟,因此将其设置为 1 分钟。
  3. 从您的小程序中实施保持活动机制。这可能很简单。只需每 30 秒对不执行任何操作的特殊 URL 执行一次 HTTP GET 即可。这将使您的会话保持活力。

该解决方案应该是对您现有解决方案的补充,其工作效率为 3/4。

我希望这有帮助。祝你好运。

I think that your code does not work in 100% cases because it is called in destroy method that does not wait and closes everything including network connections being opened. So, sometimes if network is slow the applet together with its output streams is killed before it sends the logout message to server.

If my theory is correct you can probably check it.

  • Try to see whether you get logout command in server logs (in case of failure). I believe that you will find that command did not arrive.
  • Open java console on client side. You will probably get IOException or SocketException. I hope that examining of the exception may give you an idea how to improve the solution.

Additionally I'd suggest the following.

  1. Add servlet session listener on server side and logout automatically when session is expired.
  2. Decrease time-to-live of HTTP session to reasonable number. Default value for JBoss is 20 minutes, so make it 1 minute.
  3. Implement keep-alive mechanims from your applet. It may be very simple. Just perform HTTP GET every 30 seconds to special URL that does nothing. This will keep your session alive.

This solution should be an addition to your existing solution that works 3/4 of the times.

I hope this helps. Good luck.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文