在我的Web应用程序中,当用户登录时,我将他的Id添加到servlet中的有效ID的向量中,当他退出时,我从向量中删除了他的Id,因此我可以看到有多少当前用户是活动的,如果用户忘记注销,我的servelt生成的html具有:
在标签中自动将他退出.
但我注意到许多用户永远都在那里,从未退出.我发现了为什么,通过关闭他们的浏览器,他们从不手动或自动注销,因此他们的用户ID永远不会从有效的用户ID向量中删除.
所以,我的问题是:我如何检测用户关闭他们的浏览器,所以我的servlet可以从向量中删除他们的ID?
我在隧道尽头看到一些亮点,但仍有问题,我的程序有这样的事情:
活跃用户列表:
User_1 : Machine_1 [ IP_1 address ] User_2 : Machine_2 [ IP_2 address ] User_3 : Machine_3 [ IP_3 address ] ...
我如何从会话监听器知道哪个用户的会话已经结束,从而将他从我的列表中删除?
我希望会话结束时,destroy()
会调用HttpServlet的方法,我可以在那里删除用户ID,但是当用户关闭浏览器时它永远不会被调用,为什么?HttpServlet中还有其他方法在会话关闭时被调用吗?
没有办法知道服务器端(除非您使用一些JavaScript向服务器发送消息)浏览器已关闭.怎么会有?想想HTTP的工作原理 - 一切都是请求和响应.
但是,应用程序服务器将跟踪Sessions何时处于活动状态,甚至会告诉您会话何时被销毁(例如由于超时).请查看此页面,了解如何配置HttpSessionListener
接收这些事件.然后,您可以简单地跟踪活动会话的数量.
活动会话的数量将落后于当前用户的实际数量,因为在会话超时之前必须经过一段(可配置的)时间; 但是,这应该有点接近(您可以降低会话超时以提高准确性)并且它比1)自己跟踪Sessions或2)在浏览器关闭时向服务器发送一些异步JavaScript更加清洁和简单(这不保证发送).
我建议你在Servlet引擎破坏会话时删除ID.注册一个HttpSessionListener
在sessionDestroyed()
调用时删除用户ID的.
Diodeus的想法只会帮助您更快地检测到会话结束.